On Sun, Jun 21, 2020, 11:46 AM Gregory Nutt <spudan...@gmail.com> wrote:
> > > I'm bringing up support for a new RISC-V core but I'm running into some > > issues around the sys tick. > > > > My tick timer interrupt is disabled at activating a task, clearly this is > > not correct. This is code used across all architectures so I'm sure I > just > > do not understand something > > > > void nxtask_activate(FAR struct tcb_s *tcb) > > { > > irqstate_t flags = enter_critical_section(); > > up_unblock_task(tcb); > > leave_critical_section(flags); > > } > > > > > > Won't we perform a context switch here and not leave the critical > section? > > No, the critical section is left automatically when the context switch > occurs. The critical section is not a global attribute; it is a per > task attribute. If Task A enters the critical section then suspends (as > above) the state of critical section is saved and the new state of the > critical section for the newly started Task B is instantiated. For a > new task like this, the initial state of the critical section will be > "not-in-a-critical section". > > This is described in a Wiki pages somewhere, but I don't recall which. > In know that is mentioned in the Wiki page on the critical section > monitor but I don't think that is the authoritative reference. > > So, don't worry. This has all been carefully thought through and has > worked well for 13.3 years. > I totally agree that the os is working as expected and that I am porting some functionally wrong, but I am trying to understand where the interrupts get re-enabled in this flow. The irq save/restore look like this, but when I instrument them I see a save called on the entry to the init task, but never a restore. At that point the timer isr is never triggered to indicate an OS tick. Is there another place I should be hooking to renenable the interrupt on the context switch? irqstate_t up_irq_save(void) { uint64_t oldstat; /* Read mstatus & clear machine interrupt enable (MIE) in mstatus */ asm volatile ("csrrc %0, mstatus, %1": "=r" (oldstat) : "r"(MSTATUS_MIE)); return oldstat; } void up_irq_restore(irqstate_t flags) { /* Write flags to mstatus */ asm volatile("csrw mstatus, %0" : /* no output */ : "r" (flags)); } >