Saturday, December 7, 2024

Cubicle to Creative Freedom: Work Smarter, Live Your Passion

 “Cubicle to Creative Freedom: Work Smarter, Live Your Passion”


The idea of pursuing your passion often feels like a dream reserved for a lucky few. But with the right mindset, strategy, and approach, it can become a reality for anyone willing to step outside the traditional 9-to-5 mold. The key is not just working hard but working smart.

1. Identify and Monetize Your Passion:
Understand what excites you and how it can solve a problem or add value. Research ways to monetize it, like freelancing, creating digital products, or offering services.

2. Set Clear Goals:
Break your vision into actionable steps. Use SMART goals to stay focused and track progress.

3. Leverage Technology:
Use tools and platforms to market your skills, automate repetitive tasks, and explore passive income streams like online courses or affiliate marketing.

4. Keep Learning and Networking:
Refine your skills and connect with like-minded professionals or mentors to stay inspired and expand opportunities.

5. Transition Strategically:
Start small—work on your passion alongside your current job. Scale gradually and create a financial safety net before making the leap.

6. Maintain Balance:
Build systems that allow you to work sustainably, prioritize tasks, and avoid burnout.

Pursuing your passion is about designing a career that aligns with your ‘life purpose’. Start small, work smart, and make the shift on your terms.

What’s your first step toward working smarter on your passion? Share your thoughts below!

Monday, November 4, 2024

maima

வணக்கம். சில நேரங்களில் பெங்களூரில் நடக்கும் நிகழ்வுகளை கேட்கும் போதெல்லாம், மிகவும் வேதனையும் கவலையும் அடைகிறேன். ஆனால், ஒருவரையொருவர் குறை கூறிக் கொண்டிருப்பதால் ஒரு நல்ல குடும்பத்தை உருவாக்க முடியாது என்பதை மிகவும் உறுதியாக நம்புகிறேன். அடுத்தவருடைய பிரச்சினைகளை புரிந்து கொள்வதிலும், அடுத்தவருடைய தவறுகளையும் இயலாமையையும் மன்னித்து விடுவதிலும்தான் ஒரு குடும்பத்தை உருவாக்க முடியும் என்பதை அனுபவ பூர்வமாக கண்டு கொண்டிருக்கிறேன். எனவே, யாரிடம் பேசினாலும், முடிந்தால் நல்ல அறிவுரையை, நேர்மறையான சிந்தனையை சொல்கிறேன். இல்லை என்றால், பேசாமல் இருப்பதே மேல் என்று விட்டு விடுகிறேன்.

மேலும், நான் குடும்ப விஷயங்களில் அனுபவம் இல்லாதவன் என்பதால், இந்த சூழ்நிலையில் பேசாமல் இருப்பதையே விரும்புகிறேன். இரண்டு பக்கமும் என்னைவிட வயதில் முதிர்ந்தவர்கள், அனுபவம் அதிகம் உடையவர்கள் இருக்கிறீர்கள். எனவே, தங்களுடைய குடும்ப விஷயங்களில், சூழ்நிலையை நன்றாகவே புரிந்து கொண்டு, நேரிடையாக பேசி, நல்ல முடிவுகளை எடுப்பீர்கள் என நம்புகிறேன். மேலும், தங்களுடைய இந்த குடும்ப விஷயத்தில் என்னுடைய கருத்தை திணிப்பதற்கு, யாரிடமும் எனக்கு எந்த உரிமையும் இல்லை என்பதையும் புரிந்து வைத்துள்ளேன்.

என்னைவிட வயது முதிர்ந்தவர்களை மதிப்பவன் நான். அவர்களுக்கு என்னை விட உலகத்தை பற்றிய அனுபவம் அதிகமாக இருக்கும். மேலும், என்னுடைய சூழ்நிலையே எல்லாருக்கும் இருக்காது. ஒவ்வொருவருடைய சூழ்நிலையும் ஒவ்வொன்றானது. ஆகவே, அறிவுரையாக இல்லாமல், இந்த கால கட்டத்தில், என்னுடைய சொந்த சிந்தனையை, புரிதலை முன் வைக்கிறேன்.


Wednesday, March 6, 2024

NIOS Porting steps

BSP Creation

(a0 and t2 registers could not be written or read correctly in Nios V/m)

1) Patch files created with reference to
C:\intelFPGA_pro\23.2\ip\altera\soft_processor\altera_hal2\HAL
and updated the same with script file using the $QUARTUS_ROOTDIR.
Administrator rights is necessary.

2) sample BSP creation testing..
with reference to \top_project\readme.txt, in NIOS V command shell, the following commands are executed. Some projects need "quartus_py scripts/build_sof.py" command to avoid NIOS V cpu is not specified in the hardware project.

i) niosv-bsp -c --quartus-project=hw/top.qpf --qsys=hw/sys.qsys --type=hal sw/bsp_smp/settings.bsp
ii) niosv-app --bsp-dir=sw/bsp_smp --app-dir=sw/app_smp --srcs=sw/app_smp/hello.c
iii) niosv-shell
iv) cmake -S ./sw/app_smp -G "Unix Makefiles" -B sw/app_smp/build
v) make -C sw/app_smp/build
vi) Program the FPGA using programmer
vii) using separate shell, "juart-terminal -c 1 -i 0"
viii) niosv-download -g sw/app_smp/build/app_smp.elf -c 1

BSP Build using the MACRO defined

add_definitions(-DXXXXx)






TCL programming: Check the NIOS V Processor Developer Handbook itself.

Monday, February 19, 2024

NIOS V OS porting

 First Interrupt Execution Flow:

C:\intelFPGA_pro\23.2\ip\altera\soft_processor\intel_niosv_common\HAL\src\machine_trap.S is copied to bsp generated in project folders:

C:\test\top_project\sw\bsp_freertos\HAL\src\machine_trap.S

C:\test\top_project\sw\bsp_ucosii\HAL\src\machine_trap.S

trap_vector:

        :

save_registers:
    /* Save caller-saved registers on the stack */
#if ALT_CPU_NUM_GPR == 32
    addi sp, sp, -16 * 4
    sw a6, 10 * 4(sp)
    sw a7, 11 * 4(sp)
    sw t3, 12 * 4(sp)
    sw t4, 13 * 4(sp)
    sw t5, 14 * 4(sp)
    sw t6, 15 * 4(sp)
#else // 16 (RV32E)
    addi sp, sp, -10 * 4
#endif
    sw ra,  0 * 4(sp)
    sw t0,  1 * 4(sp)
    sw t1,  2 * 4(sp)
    sw t2,  3 * 4(sp)
    sw a0,  4 * 4(sp)
    sw a1,  5 * 4(sp)
    sw a2,  6 * 4(sp)
    sw a3,  7 * 4(sp)
    sw a4,  8 * 4(sp)
    sw a5,  9 * 4(sp)
   
    /* Call handle_trap to dispatch the correct handler, if available */
    csrr a0, mcause
    csrr a1, mepc
    csrr a2, mtval
    jal handle_trap
    csrw mepc, a0
        :

top_project\sw\bsp_ucosii\HAL\src\alt_irq_handler.c
top_project\sw\bsp_freertos\HAL\src\alt_irq_handler.c
alt_u32 handle_trap(alt_u32 cause, alt_u32 epc, alt_u32 tval)

{

    alt_u32 is_irq, exception_code;

    is_irq = (cause & NIOSV_MCAUSE_INTERRUPT_MASK);
    exception_code = (cause & ~NIOSV_MCAUSE_INTERRUPT_MASK);

    if (is_irq) {
        switch (exception_code) {
            case NIOSV_TIMER_IRQ:
            {
                if (alt_niosv_timer_interrupt_handler) {
                    ALT_OS_INT_ENTER();
                    alt_niosv_timer_interrupt_handler(cause, epc, tval);
                    ALT_OS_INT_EXIT();
                }
                break;
            }
            case NIOSV_SOFTWARE_IRQ:
            {
                if (alt_niosv_software_interrupt_handler) {
                    ALT_OS_INT_ENTER();
                    alt_niosv_software_interrupt_handler(cause, epc, tval);
                    ALT_OS_INT_EXIT();
                }
                break;
            default:
            {
                if (exception_code >= 16) {
                    alt_irq_handler();
                } else {
                    ALT_LOG_PRINTF("invalid exception code: %d, epc = %d, tval = %d\n", exception_code, epc, tval);
                }
                break;
            }
                    :
/*
 * A table describing each interrupt handler. The index into the array is the
 * interrupt id associated with the handler. 
 *
 * When an interrupt occurs, the associated handler is called with
 * the argument stored in the context member.
 */
struct ALT_IRQ_HANDLER
{
  void (*handler)(void*);
  void *context;
} alt_irq[ALT_NIRQ];

/*
 * alt_irq_handler() is called by the interrupt exception handler in order to 
 * process any outstanding interrupts. 
 *
 * It is defined here since it is linked in using weak linkage. 
 * This means that if there is never a call to alt_irq_register() then
 * this function will not get linked in to the executable. This is acceptable
 * since if no handler is ever registered, then an interrupt can never occur.
 */
void alt_irq_handler (void)
{
    alt_u32 active;
    alt_u32 mask;
    alt_u32 i;

    /*
     * Notify the operating system that we are at interrupt level.
     */  
    ALT_OS_INT_ENTER();
                        :
                alt_irq[i].handler(alt_irq[i].context); 
                        :
    /*
     * Notify the operating system that interrupt processing is complete.
     */ 

    ALT_OS_INT_EXIT();
}

There seems to be a major difference between FreeRTOS and uCOS II in interrupt handling that FreeRTOS seems to be calling BSP's handle_trap() from its own trap_vector instead of you provide the ALT_OS_INT_ENTER/ALT_OS_INT_EXIT() for the BSP's trap_vector() and handle_trap(). Check that as it would be better for you.

top_project\sw\bsp_freertos\HAL\src\os_cpu_c.c

/* handle_trap() and alt_tick() are Intel HAL function. */
extern alt_u32 handle_trap( alt_u32 cause, alt_u32 epc, alt_u32 tval );
extern void alt_tick( void );

#define HAL_HANDLE_TRAP();  alt_u32 ulMCAUSE = 0, ulMEPC = 0, ulMTVAL = 0;           \
                          __asm volatile( "csrr %0, mcause" : "=r"( ulMCAUSE ) );  \
                            __asm volatile( "csrr %0, mepc" : "=r"( ulMEPC ) );      \
                            __asm volatile( "csrr %0, mtval" : "=r"( ulMTVAL ) );    \
                            ulHalNestedInterruptCounter++;                           \
                            handle_trap(ulMCAUSE, ulMEPC, ulMTVAL);                  \
                            ulHalNestedInterruptCounter--;                           \

/* Hook for tick. To use this, configUSE_TICK_HOOK must set to 1 */
void vApplicationTickHook( void )
{
    /* ALT_LOG - see altera_hal/HAL/inc/sys/alt_log_printf.h */
    ALT_LOG_SYS_CLK_HEARTBEAT();

    ulHalNestedInterruptCounter++;
    alt_tick();
    ulHalNestedInterruptCounter--;
}
                        :
/* Override weak function defined in portASM.S */
void freertos_risc_v_application_interrupt_handler( void )
{
   HAL_HANDLE_TRAP();
}

/* Override weak function defined in portASM.S */
void freertos_risc_v_application_exception_handler( void )
{
   HAL_HANDLE_TRAP();
}

freertos_risc_v_trap_handler  is assigned as Vector Base Address in mtvec register.

│Installing the FreeRTOS trap handler

│The FreeRTOS trap handler is called freertos_risc_v_trap_handler() and is the central
entry point for all interrupts and exceptions.


top_project\sw\bsp_freertos\FREERTOS\inc\os\alt_hooks.h
#define ALT_OS_INIT()           alt_envsem = xSemaphoreCreateCounting(1, 1);                                \
                                alt_heapsem = xSemaphoreCreateCounting(1, 1);                               \
                                extern void freertos_risc_v_trap_handler( void );                           \
                                __asm__ volatile( "csrw mtvec, %0" :: "r"( freertos_risc_v_trap_handler ) )