void hthread_mutex_unlock(int lock_number) { volatile int * cmd; int status; // Form proc_interface_t from PVR register proc_interface_t iface; int hwti_base; getpvr(1,hwti_base); initialize_interface(&iface, (int*)hwti_base); cmd = (int*)mutex_cmd( HT_MUTEX_UNLOCK, *(iface.tid_reg), lock_number ); status = *cmd; }
int hthread_self() { int tid; // Retrieve HWTI pointer proc_interface_t iface; int hwti_base; // Form proc_interface_t from PVR register getpvr(1,hwti_base); initialize_interface(&iface, (int*)hwti_base); // Extract and return TID return *(iface.tid_reg); }
// Main event loop int main() { proc_interface_t hwti; // Get HWTI base address from user PVR register int hwti_base; getpvr(1,hwti_base); // Enable instruction cache (reduce PLB load) microblaze_init_icache_range(0, 8192); microblaze_enable_icache(); while(1) { // Setup interface // * Perform this upon each iteration, just in case the memory // map for the MB-HWTI is corrupted. initialize_interface(&hwti,(int*)(hwti_base)); // Wait to be "reset" // -- NOTE: Ignore reset as it has no meaning to the MB-HWTI // and it seems causes a race, as the controlling processor // sends a reset, immediately followed by a "go" command. Therefore // the "reset" command can be missed. //wait_for_reset_command(&hwti); // Wait to be "started" wait_for_go_command(&hwti); //xil_printf("Thread started (fcn @ 0x%08x), arg = 0x%08x!!!\r\n",*(hwti.fcn_reg), *(hwti.arg_reg)); // Setup r20 for thread (only needed for PIC code, i.e. print-related functions) mtgpr(r20, *(hwti.fcn_reg)); // Boostrap thread // * Pull out thread argument, and thread start function _bootstrap_thread(&hwti, *(hwti.fcn_reg), *(hwti.arg_reg)); //_bootstrap_thread(&hwti, factorial_thread, *(hwti.arg_reg)); // Use this when hard-coding functionality } return 0; }
int main() { proc_interface_t hwti; // Get HWTI base address from user PVR register int hwti_base; getpvr(1,hwti_base); // Disable instruction and data cache microblaze_invalidate_icache(); microblaze_disable_icache(); microblaze_invalidate_dcache(); microblaze_disable_dcache(); // Nano-kernel loop... while(1) { // Setup interface // * Perform this upon each iteration, just in case the memory // map for the MB-HWTI is corrupted. initialize_interface(&hwti,(int*)(hwti_base)); #if 0 // Commented out as this is not necessary and it creates the opportunity for a race between reset and start commands // Wait to be "reset" // -- NOTE: Ignore reset as it has no meaning to the MB-HWTI // and it seems causes a race, as the controlling processor // sends a reset, immediately followed by a "go" command. Therefore // the "reset" command can be missed. wait_for_reset_command(&hwti); #endif // Wait to be "started" wait_for_go_command(&hwti); //xil_printf("Thread started (fcn @ 0x%08x), arg = 0x%08x!!!\r\n",*(hwti.fcn_reg), *(hwti.arg_reg)); // Setup r20 for thread, this can be used to enforce -fPIC (Position-independent code) for the MB // (r20 is used as part of the GOT, to make things PC-relative) mtgpr(r20, *(hwti.fcn_reg)); // Boostrap thread (wraps up thread execution with a thread exit) // * Pull out thread argument, and thread start function _bootstrap_thread(&hwti, *(hwti.fcn_reg), *(hwti.arg_reg)); } return 0; }
int main (int argc, char** argv) { int win; glutInit(&argc,argv); glutInitWindowSize(800,600); glutInitWindowPosition(140,80); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); win = glutCreateWindow("raytrace"); glui = GLUI_Master.create_glui_subwindow(win, GLUI_SUBWINDOW_TOP); init(800,600); glutDisplayFunc(display); GLUI_Master.set_glutIdleFunc(idleFunction); glui->set_main_gfx_window(win); initialize_interface(); glutMainLoop(); return 0; }
void hthread_mutex_lock( int lock_number) { volatile int * cmd; int status; proc_interface_t iface; int hwti_base; // Form proc_interface_t from PVR register getpvr(1,hwti_base); initialize_interface(&iface, (int*)hwti_base); cmd = (int*)mutex_cmd( HT_MUTEX_LOCK, *(iface.tid_reg), lock_number ); status = *cmd; // Check to see if lock was successful if( status == HT_MUTEX_BLOCK ) { // Block until go command comes in wait_for_go_command(&iface); } // Got the lock! return; }
int main() { proc_interface_t hwti; // Get HWTI base address from user PVR register int hwti_base; unsigned char cpu_id; // only 8bits getpvr(1,hwti_base); // Disable instruction and data cache microblaze_invalidate_icache(); microblaze_enable_icache(); microblaze_invalidate_dcache(); microblaze_disable_dcache(); //Determine if uB is first on bus getpvr(0, cpu_id); // Timer pointers volatile unsigned long long * timer = (unsigned long long *) LOCAL_TIMER; volatile unsigned int * timer_reset = (unsigned int *) (LOCAL_TIMER + RESET_REG); // Reset timer *timer_reset = CMD_RESET; // Indicate to CoreTest.c running on host that this processor is running volatile unsigned int * check = (unsigned int *) EXTRA_BRAM; // assign cpus_per_bus offset check = (unsigned int *) ((unsigned int) check + ( ((unsigned int) cpu_id) * 0x100)); // write OKAY_VALUE to common memory (extra_bram) *check = OKAY_VALUE; // Nano-kernel loop... while(1) { // Setup interface // * Perform this upon each iteration, just in case the memory // map for the MB-HWTI is corrupted. initialize_interface(&hwti,(int*)(hwti_base)); #if 0 // Commented out as this is not necessary and it creates the opportunity for a race between reset and start commands // Wait to be "reset" // -- NOTE: Ignore reset as it has no meaning to the MB-HWTI // and it seems causes a race, as the controlling processor // sends a reset, immediately followed by a "go" command. Therefore // the "reset" command can be missed. wait_for_reset_command(&hwti); #endif // Wait to be "started" wait_for_go_command(&hwti); //xil_printf("Thread started (fcn @ 0x%08x), arg = 0x%08x!!!\r\n",*(hwti.fcn_reg), *(hwti.arg_reg)); // Setup r20 for thread, this can be used to enforce -fPIC (Position-independent code) for the MB // (r20 is used as part of the GOT, to make things PC-relative) mtgpr(r20, *(hwti.fcn_reg)); // Boostrap thread (wraps up thread execution with a thread exit) // * Pull out thread argument, and thread start function _bootstrap_thread(&hwti, *(hwti.fcn_reg), *(hwti.arg_reg)); } return 0; }