Hi,
I have a clock source setup with ticks every 1ms. To this I have attached a function that gets called every 1000 ticks (1 second). In this function, I am trying to update the information displayed on my graphics lcd.
The function is being executed (confirmed by toggling a led from within this function), but nothing is being updated on the graphics lcd. I am able to see the text that i print on the lcd in my main task, but anything that I try to update from within the clock function does not get reflected on the lcd.
Would appreciate any help
here is my code
/* * ======== empty_min.c ======== */ /* XDCtools Header files */ #include <xdc/std.h> #include <xdc/runtime/System.h> #include <xdc/runtime/Log.h> /* BIOS Header files */ #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/knl/Clock.h> /* TI-RTOS Header files */ // #include <ti/drivers/I2C.h> #include <ti/drivers/PIN.h> #include <ti/drivers/SPI.h> #include <ti/drivers/PIN.h> // #include <ti/drivers/UART.h> // #include <ti/drivers/Watchdog.h> #include <ti/mw/lcd/LCDDogm1286.h> /* Board HPIN_IRQ_NEGEDGEeader files */ #include "Board.h" #define TASKSTACKSIZE 512 /* Pin driver handle */ PIN_Handle ledPinHandle; PIN_State ledPinState; LCD_Handle lcdHandle = NULL; UInt8 RF_transmission_timer = 20; Uint8 RF_transmission_timer_started = 0; /* This application supports two LCD buffers */ Char lcdBuffer0[LCD_BYTES] = { 0 }; LCD_Buffer lcdBuffers[] = { { lcdBuffer0, LCD_BYTES, {NULL} } }; PIN_Config ledPinTable[] = { Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_LED3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_LED4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_3V3_EN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, Board_KEY_DOWN | PIN_PULLUP | PIN_IRQ_NEGEDGE, PIN_TERMINATE }; /* * ======== main ======== */ int main(void) { //board init functions Board_initGeneral(); Board_initSPI(); // Board_initI2C(); // Board_initUART(); // Board_initWatchdog(); ledPinHandle = PIN_open(&ledPinState, ledPinTable); if(!ledPinHandle) { Log_info0("Error initializing board LED pins\n"); } PIN_setOutputValue(ledPinHandle, Board_LED1, 1); PIN_setOutputValue(ledPinHandle, Board_3V3_EN, 1); /* Start BIOS */ BIOS_start(); return (0); } //GLCD updating task void task_lcd_fn(UArg a0, UArg a1) { LCD_Params lcdParams; Log_info0("executing task_lcd"); if (!lcdHandle) { LCD_Params_init(&lcdParams); lcdParams.spiBitRate = 1000000; lcdHandle = LCD_open(lcdBuffers, 1, &lcdParams); if (!lcdHandle) { Log_info0("Error initializing LCD\n"); } } LCD_bufferClear(lcdHandle, 0); LCD_bufferPrintString(lcdHandle, 0, "SemaConnect", LCD_ALIGN_CENTER, LCD_PAGE0); LCD_bufferPrintString(lcdHandle, 0, "SimpleLink RF Demo", LCD_ALIGN_CENTER, LCD_PAGE1); LCD_bufferPrintString(lcdHandle, 0, "Aug 21 2016", LCD_ALIGN_CENTER, LCD_PAGE2); LCD_update(lcdHandle, 0); while(1); } void clock_update_lcd_adc_fn(UArg a0) { Log_info0("clock lcd function"); //toggle LED1 PIN_setOutputValue(ledPinHandle, Board_LED2, !PIN_getOutputValue(Board_LED2)); //update lcd with time left for next sending of RF data if(RF_transmission_timer_started == 0) { RF_transmission_timer_started = 1; } else { //timer already started RF_transmission_timer--; if(RF_transmission_timer == 0) { RF_transmission_timer_started = 0; } } LCD_bufferPrintString(lcdHandle, 0 , "Next RF TX in", LCD_ALIGN_LEFT , LCD_PAGE4); LCD_bufferPrintInt(lcdHandle, 0, RF_transmission_timer, LCD_ALIGN_LEFT, LCD_PAGE5); LCD_bufferPrintString(lcdHandle, 0 , "seconds ...", LCD_ALIGN_LEFT , LCD_PAGE6); LCD_update(lcdHandle, 0); }
And here is my configuration file
/* ================ Boot configuration ================ */ var Boot = xdc.useModule('ti.sysbios.family.arm.cc26xx.Boot'); /* * This module contains family specific Boot APIs and configuration settings. * See the SYS/BIOS API guide for more information. */ /* ================ Clock configuration ================ */ var Clock = xdc.useModule('ti.sysbios.knl.Clock'); var LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup'); var Timer = xdc.useModule('ti.sysbios.hal.Timer'); /* * When using Power and calibrateRCOSC is set to true, this should be set to 10. * The timer used by the Clock module supports TickMode_DYNAMIC. This enables us * to set the tick period to 10 us without generating the overhead of additional * interrupts. * * Note: The calibrateRCOSC parameter is set within the Power configuration * structure in the "Board.c" file. */ Clock.tickPeriod = 1000; /* ================ Defaults (module) configuration ================ */ var Defaults = xdc.useModule('xdc.runtime.Defaults'); /* * A flag to allow module names to be loaded on the target. Module name * strings are placed in the .const section for debugging purposes. * * Pick one: * - true (default) * Setting this parameter to true will include name strings in the .const * section so that Errors and Asserts are easier to debug. * - false * Setting this parameter to false will reduce footprint in the .const * section. As a result, Error and Assert messages will contain an * "unknown module" prefix instead of the actual module name. * * When using BIOS in ROM: * This option must be set to false. */ //Defaults.common$.namedModule = true; Defaults.common$.namedModule = false; /* ================ Error configuration ================ */ var Error = xdc.useModule('xdc.runtime.Error'); /* * This function is called to handle all raised errors, but unlike * Error.raiseHook, this function is responsible for completely handling the * error with an appropriately initialized Error_Block. * * Pick one: * - Error.policyDefault (default) * Calls Error.raiseHook with an initialized Error_Block structure and logs * the error using the module's logger. * - Error.policySpin * Simple alternative that traps on a while(1) loop for minimized target * footprint. * Using Error.policySpin, the Error.raiseHook will NOT called. */ //Error.policyFxn = Error.policyDefault; Error.policyFxn = Error.policySpin; /* * If Error.policyFxn is set to Error.policyDefault, this function is called * whenever an error is raised by the Error module. * * Pick one: * - Error.print (default) * Errors are formatted and output via System_printf() for easier * debugging. * - null * Errors are not formatted or logged. This option reduces code footprint. * - non-null function * Errors invoke custom user function. See the Error module documentation * for more details. */ //Error.raiseHook = Error.print; Error.raiseHook = null; //Error.raiseHook = "&myErrorFxn"; /* * If Error.policyFxn is set to Error.policyDefault, this option applies to the * maximum number of times the Error.raiseHook function can be recursively * invoked. This option limits the possibility of an infinite recursion that * could lead to a stack overflow. * The default value is 16. */ Error.maxDepth = 2; /* ================ Hwi configuration ================ */ var halHwi = xdc.useModule('ti.sysbios.hal.Hwi'); var m3Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi'); /* * Checks for Hwi (system) stack overruns while in the Idle loop. * * Pick one: * - true (default) * Checks the top word for system stack overflows during the idle loop and * raises an Error if one is detected. * - false * Disabling the runtime check improves runtime performance and yields a * reduced flash footprint. */ //halHwi.checkStackFlag = true; halHwi.checkStackFlag = false; /* * The following options alter the system's behavior when a hardware exception * is detected. * * Pick one: * - Hwi.enableException = true * This option causes the default m3Hwi.excHandlerFunc function to fully * decode an exception and dump the registers to the system console. * This option raises errors in the Error module and displays the * exception in ROV. * - Hwi.enableException = false * This option reduces code footprint by not decoding or printing the * exception to the system console. * It however still raises errors in the Error module and displays the * exception in ROV. * - Hwi.excHandlerFunc = null * This is the most aggressive option for code footprint savings; but it * can difficult to debug exceptions. It reduces flash footprint by * plugging in a default while(1) trap when exception occur. This option * does not raise an error with the Error module. */ //m3Hwi.enableException = true; //m3Hwi.enableException = false; m3Hwi.excHandlerFunc = null; /* * Enable hardware exception generation when dividing by zero. * * Pick one: * - 0 (default) * Disables hardware exceptions when dividing by zero * - 1 * Enables hardware exceptions when dividing by zero */ m3Hwi.nvicCCR.DIV_0_TRP = 0; //m3Hwi.nvicCCR.DIV_0_TRP = 1; /* * Enable hardware exception generation for invalid data alignment. * * Pick one: * - 0 (default) * Disables hardware exceptions for data alignment * - 1 * Enables hardware exceptions for data alignment */ m3Hwi.nvicCCR.UNALIGN_TRP = 0; //m3Hwi.nvicCCR.UNALIGN_TRP = 1; /* * Assign an address for the reset vector. * * Default is 0x0, which is the start of Flash. Ordinarily this setting should * not be changed. */ m3Hwi.resetVectorAddress = 0x0; /* * Assign an address for the vector table in RAM. * * The default is the start of RAM. This table is placed in RAM so interrupts * can be added at runtime. * * Note: To change, verify address in the device specific datasheets' * memory map. */ m3Hwi.vectorTableAddress = 0x20000000; /* ================ Idle configuration ================ */ var Idle = xdc.useModule('ti.sysbios.knl.Idle'); /* * The Idle module is used to specify a list of functions to be called when no * other tasks are running in the system. * * Functions added here will be run continuously within the idle task. * * Function signature: * Void func(Void); */ //Idle.addFunc("&myIdleFunc"); /* ================ Kernel (SYS/BIOS) configuration ================ */ var BIOS = xdc.useModule('ti.sysbios.BIOS'); /* * Enable asserts in the BIOS library. * * Pick one: * - true (default) * Enables asserts for debugging purposes. * - false * Disables asserts for a reduced code footprint and better performance. * * When using BIOS in ROM: * This option must be set to false. */ //BIOS.assertsEnabled = true; BIOS.assertsEnabled = false; /* * Specify default heap size for BIOS. */ BIOS.heapSize = 1024; /* * Specify default CPU Frequency. */ BIOS.cpuFreq.lo = 48000000; /* * A flag to determine if xdc.runtime sources are to be included in a custom * built BIOS library. * * Pick one: * - false (default) * The pre-built xdc.runtime library is provided by the respective target * used to build the application. * - true * xdc.runtime library sources are to be included in the custom BIOS * library. This option yields the most efficient library in both code * footprint and runtime performance. */ //BIOS.includeXdcRuntime = false; BIOS.includeXdcRuntime = true; /* * The SYS/BIOS runtime is provided in the form of a library that is linked * with the application. Several forms of this library are provided with the * SYS/BIOS product. * * Pick one: * - BIOS.LibType_Custom * Custom built library that is highly optimized for code footprint and * runtime performance. * - BIOS.LibType_Debug * Custom built library that is non-optimized that can be used to * single-step through APIs with a debugger. * */ BIOS.libType = BIOS.LibType_Custom; //BIOS.libType = BIOS.LibType_Debug; /* * Runtime instance creation enable flag. * * Pick one: * - true (default) * Allows Mod_create() and Mod_delete() to be called at runtime which * requires a default heap for dynamic memory allocation. * - false * Reduces code footprint by disallowing Mod_create() and Mod_delete() to * be called at runtime. Object instances are constructed via * Mod_construct() and destructed via Mod_destruct(). * * When using BIOS in ROM: * This option must be set to true. */ BIOS.runtimeCreatesEnabled = true; //BIOS.runtimeCreatesEnabled = false; /* * Enable logs in the BIOS library. * * Pick one: * - true (default) * Enables logs for debugging purposes. * - false * Disables logging for reduced code footprint and improved runtime * performance. * * When using BIOS in ROM: * This option must be set to false. */ //BIOS.logsEnabled = true; BIOS.logsEnabled = false; /* ================ Memory configuration ================ */ var Memory = xdc.useModule('xdc.runtime.Memory'); /* * The Memory module itself simply provides a common interface for any * variety of system and application specific memory management policies * implemented by the IHeap modules(Ex. HeapMem, HeapBuf). */ /* ================ Program configuration ================ */ /* * Program.stack is ignored with IAR. Use the project options in * IAR Embedded Workbench to alter the system stack size. */ if (!Program.build.target.$name.match(/iar/)) { /* * Reducing the system stack size (used by ISRs and Swis) to reduce * RAM usage. */ Program.stack = 768; } /* * Uncomment to enable Semihosting for GNU targets to print to the CCS console. * Please read the following TIRTOS Wiki page for more information on Semihosting: * processors.wiki.ti.com/.../TI-RTOS_Examples_SemiHosting */ if (Program.build.target.$name.match(/gnu/)) { //var SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport'); } /* ================ ROM configuration ================ */ /* * To use BIOS in flash, comment out the code block below. */ var ROM = xdc.useModule('ti.sysbios.rom.ROM'); if (Program.cpu.deviceName.match(/CC26/)) { ROM.romName = ROM.CC2650; } else if (Program.cpu.deviceName.match(/CC13/)) { ROM.romName = ROM.CC1350; } /* ================ Semaphore configuration ================ */ var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore'); /* * Enables global support for Task priority pend queuing. * * Pick one: * - true (default) * This allows pending tasks to be serviced based on their task priority. * - false * Pending tasks are services based on first in, first out basis. * * When using BIOS in ROM: * This option must be set to false. */ //Semaphore.supportsPriority = true; Semaphore.supportsPriority = false; /* * Allows for the implicit posting of events through the semaphore, * disable for additional code saving. * * Pick one: * - true * This allows the Semaphore module to post semaphores and events * simultaneously. * - false (default) * Events must be explicitly posted to unblock tasks. * * When using BIOS in ROM: * This option must be set to false. */ //Semaphore.supportsEvents = true; Semaphore.supportsEvents = false; /* ================ Swi configuration ================ */ var Swi = xdc.useModule('ti.sysbios.knl.Swi'); /* * A software interrupt is an object that encapsulates a function to be * executed and a priority. Software interrupts are prioritized, preempt tasks * and are preempted by hardware interrupt service routines. * * This module is included to allow Swi's in a users' application. */ /* * Reduce the number of swi priorities from the default of 16. * Decreasing the number of swi priorities yields memory savings. */ Swi.numPriorities = 6; /* ================ System configuration ================ */ var System = xdc.useModule('xdc.runtime.System'); /* * The Abort handler is called when the system exits abnormally. * * Pick one: * - System.abortStd (default) * Call the ANSI C Standard 'abort()' to terminate the application. * - System.abortSpin * A lightweight abort function that loops indefinitely in a while(1) trap * function. * - A custom abort handler * A user-defined function. See the System module documentation for * details. */ //System.abortFxn = System.abortStd; System.abortFxn = System.abortSpin; //System.abortFxn = "&myAbortSystem"; /* * The Exit handler is called when the system exits normally. * * Pick one: * - System.exitStd (default) * Call the ANSI C Standard 'exit()' to terminate the application. * - System.exitSpin * A lightweight exit function that loops indefinitely in a while(1) trap * function. * - A custom exit function * A user-defined function. See the System module documentation for * details. */ //System.exitFxn = System.exitStd; System.exitFxn = System.exitSpin; //System.exitFxn = "&myExitSystem"; /* * Minimize exit handler array in the System module. The System module includes * an array of functions that are registered with System_atexit() which is * called by System_exit(). The default value is 8. */ System.maxAtexitHandlers = 0; /* * The System.SupportProxy defines a low-level implementation of System * functions such as System_printf(), System_flush(), etc. * * Pick one pair: * - SysMin * This module maintains an internal configurable circular buffer that * stores the output until System_flush() is called. * The size of the circular buffer is set via SysMin.bufSize. * - SysCallback * SysCallback allows for user-defined implementations for System APIs. * The SysCallback support proxy has a smaller code footprint and can be * used to supply custom System_printf services. * The default SysCallback functions point to stub functions. See the * SysCallback module's documentation. */ //var SysMin = xdc.useModule('xdc.runtime.SysMin'); //SysMin.bufSize = 128; //System.SupportProxy = SysMin; var SysCallback = xdc.useModule('xdc.runtime.SysCallback'); System.SupportProxy = SysCallback; //SysCallback.abortFxn = "&myUserAbort"; //SysCallback.exitFxn = "&myUserExit"; //SysCallback.flushFxn = "&myUserFlush"; //SysCallback.putchFxn = "&myUserPutch"; //SysCallback.readyFxn = "&myUserReady"; /* ================ Task configuration ================ */ var Task = xdc.useModule('ti.sysbios.knl.Task'); /* * Check task stacks for overflow conditions. * * Pick one: * - true (default) * Enables runtime checks for task stack overflow conditions during * context switching ("from" and "to") * - false * Disables runtime checks for task stack overflow conditions. * * When using BIOS in ROM: * This option must be set to false. */ //Task.checkStackFlag = true; Task.checkStackFlag = false; /* * Set the default task stack size when creating tasks. * * The default is dependent on the device being used. Reducing the default stack * size yields greater memory savings. */ Task.defaultStackSize = 512; /* * Enables the idle task. * * Pick one: * - true (default) * Creates a task with priority of 0 which calls idle hook functions. This * option must be set to true to gain power savings provided by the Power * module. * - false * No idle task is created. This option consumes less memory as no * additional default task stack is needed. * To gain power savings by the Power module without having the idle task, * add Idle.run as the Task.allBlockedFunc. */ Task.enableIdleTask = true; //Task.enableIdleTask = false; //Task.allBlockedFunc = Idle.run; /* * If Task.enableIdleTask is set to true, this option sets the idle task's * stack size. * * Reducing the idle stack size yields greater memory savings. */ Task.idleTaskStackSize = 512; /* * Reduce the number of task priorities. * The default is 16. * Decreasing the number of task priorities yield memory savings. */ Task.numPriorities = 4; /* ================ Text configuration ================ */ var Text = xdc.useModule('xdc.runtime.Text'); /* * These strings are placed in the .const section. Setting this parameter to * false will save space in the .const section. Error, Assert and Log messages * will print raw ids and args instead of a formatted message. * * Pick one: * - true (default) * This option loads test string into the .const for easier debugging. * - false * This option reduces the .const footprint. */ //Text.isLoaded = true; Text.isLoaded = false; /* ================ Types configuration ================ */ var Types = xdc.useModule('xdc.runtime.Types'); /* * This module defines basic constants and types used throughout the * xdc.runtime package. */ /* ================ TI-RTOS middleware configuration ================ */ var mwConfig = xdc.useModule('ti.mw.Config'); /* * Include TI-RTOS middleware libraries */ /* ================ TI-RTOS drivers' configuration ================ */ var driversConfig = xdc.useModule('ti.drivers.Config'); /* * Include TI-RTOS drivers * * Pick one: * - driversConfig.LibType_NonInstrumented (default) * Use TI-RTOS drivers library optimized for footprint and performance * without asserts or logs. * - driversConfig.LibType_Instrumented * Use TI-RTOS drivers library for debugging with asserts and logs enabled. */ driversConfig.libType = driversConfig.LibType_NonInstrumented; //driversConfig.libType = driversConfig.LibType_Instrumented; /* ================ Application Specific Instances ================ */ var task0Params = new Task.Params(); task0Params.instance.name = "task_lcd"; Program.global.task_lcd = Task.create("&task_lcd_fn", task0Params); Clock.tickMode = Clock.TickMode_DYNAMIC; var clock0Params = new Clock.Params(); clock0Params.instance.name = "clock_update_lcd_adc"; clock0Params.period = 1000; clock0Params.startFlag = true; Program.global.clock_update_lcd_adc = Clock.create("&clock_update_lcd_adc_fn", 1000, clock0Params); Clock.timerId = -1; Clock.swiPriority = 5;