/** * * Start the robot code. * This function starts the robot code running by spawning a task. Currently tasks seemed to be * started by LVRT without setting the VX_FP_TASK flag so floating point context is not saved on * interrupts. Therefore the program experiences hard to debug and unpredictable results. So the * LVRT code starts this function, and it, in turn, starts the actual user program. */ void RobotBase::startRobotTask(FUNCPTR factory) { #ifdef SVN_REV if (strlen(SVN_REV)) { printf("WPILib was compiled from SVN revision %s\n", SVN_REV); } else { printf("WPILib was compiled from a location that is not source controlled.\n"); } #else printf("WPILib was compiled without -D'SVN_REV=nnnn'\n"); #endif // Check for startup code already running int32_t oldId = taskNameToId(const_cast<char*>("FRC_RobotTask")); if (oldId != ERROR) { // Find the startup code module. char moduleName[256]; moduleNameFindBySymbolName("FRC_UserProgram_StartupLibraryInit", moduleName); MODULE_ID startupModId = moduleFindByName(moduleName); if (startupModId != NULL) { // Remove the startup code. unldByModuleId(startupModId, 0); printf("!!! Error: Default code was still running... It was unloaded for you... Please try again.\n"); return; } // This case should no longer get hit. printf("!!! Error: Other robot code is still running... Unload it and then try again.\n"); return; } // Let the framework know that we are starting a new user program so the Driver Station can disable. FRC_NetworkCommunication_observeUserProgramStarting(); // Let the Usage Reporting framework know that there is a C++ program running nUsageReporting::report(nUsageReporting::kResourceType_Language, nUsageReporting::kLanguage_CPlusPlus); RobotBase::WriteVersionString(); // Start robot task // This is done to ensure that the C++ robot task is spawned with the floating point // context save parameter. Task *task = new Task("RobotTask", (FUNCPTR)RobotBase::robotTask, Task::kDefaultPriority, 64000); task->Start((int32_t)factory, (int32_t)task); }
/****************************************************************************** ** Function: CFE_PSP_GetCFETextSegmentInfo ** ** Purpose: ** This function returns the start and end address of the CFE text segment. ** It may not be implemented on all architectures. ** ** Arguments: ** (none) ** ** Return: ** (none) */ int32 CFE_PSP_GetCFETextSegmentInfo(void *PtrToCFESegment, uint32 *SizeOfCFESegment) { int32 return_code; uint32 Address; STATUS status; MODULE_ID cFEModuleId; MODULE_INFO cFEModuleInfo; if ( SizeOfCFESegment == NULL ) { return_code = CFE_PSP_ERROR; } else { cFEModuleId = moduleFindByName(CFE_MODULE_NAME); if ( cFEModuleId == NULL ) { return_code = CFE_PSP_ERROR; } else { status = moduleInfoGet(cFEModuleId, &cFEModuleInfo); if ( status != ERROR ) { Address = (uint32)(cFEModuleInfo.segInfo.textAddr); memcpy(PtrToCFESegment,&Address,sizeof(PtrToCFESegment)); *SizeOfCFESegment = (uint32)(cFEModuleInfo.segInfo.textSize); return_code = CFE_PSP_SUCCESS; } else { return_code = CFE_PSP_SUCCESS; } } } return(return_code); }
ACE_SHLIB_HANDLE vxworks_modulefind(char *name) { return moduleFindByName(name); }