OK, we know that Siren_Active() is successfully created as a task, because it runs / starts.
The calls to OS_Timer() do not behave normally.
1) I presume you have global interrupts enabled all the time?
2) As I mentioned before, all Salvo needs for good timing is for OSTimer() to be called at a particular rate. If it's failing (e.g. siren goes ON and never goes off), that means that the task never runs again after timing out. Assuming priorities are not a problem, that means that the task is "stuck" in the delayed state.
3) Here's what I would do -- take this code (only) and run it in MPLAB's SIM. Watch OStcbArea[], specifically the tcb for this particular task. Break on OSTimer(). Watch the delay field in the task's tcb. Once the task is delayed (i.e. after the siren goes ON), its delay field should decrement each time OSSched() runs after OSTimer() is called. After the last decrement, Siren_Active() should run again and "fall into" the } while(--i).
Zip up a simple project just with this task and email it to me, and I'll run it here in the SIM. Note that I am assuming that your salvocfg.h is as below (only those 8 lines), you haven't modified any Salvo source code, etc.
------------------