⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.h

📁 tinyos2.0版本驱动
💻 H
字号:
/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright *   notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright *   notice, this list of conditions and the following disclaimer in the *   documentation and/or other materials provided with the *   distribution. * - Neither the name of the Stanford University nor the names of *   its contributors may be used to endorse or promote products derived *   from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues <klueska@cs.stanford.edu> */#ifndef THREAD_H#define THREAD_H#include "chip_thread.h"#include "refcounter.h"typedef uint8_t thread_id_t;                           //Typedef for thread_id_ttypedef uint8_t syscall_id_t;                          //Typedef for syscall_id_ttypedef thread_id_t tosthread_t;                       //Typedef for tosthread_t used to initialize a c-based thread#ifndef TOSTHREAD_MAIN_STACK_SIZE#define TOSTHREAD_MAIN_STACK_SIZE   500  //Default stack size for the main thread that spawns all other threads in the c based api#endif//Since thread initialization is encapsulated //inside a generic component, we can statically //know the number of threads created at compile //time#define UQ_TOS_THREAD "Unique.TOS.Thread"enum {#ifdef MAX_NUM_THREADS  TOSTHREAD_MAX_NUM_THREADS = MAX_NUM_THREADS,#else  TOSTHREAD_MAX_NUM_THREADS = 33,   //Maximum number of threads allowed to run (must be less than sizeof(thread_id_t))#endif  TOSTHREAD_NUM_STATIC_THREADS = uniqueCount(UQ_TOS_THREAD),  //The number of statically allocated threads  TOSTHREAD_MAX_DYNAMIC_THREADS = TOSTHREAD_MAX_NUM_THREADS - TOSTHREAD_NUM_STATIC_THREADS,  TOSTHREAD_TOS_THREAD_ID = TOSTHREAD_MAX_NUM_THREADS,        //The ID of the TinyOS thread (One more than max allowable threads)  TOSTHREAD_INVALID_THREAD_ID = TOSTHREAD_MAX_NUM_THREADS,    //An invalid thread id  TOSTHREAD_PREEMPTION_PERIOD = 5,                            //The preemption period for switching between threads};enum {  INVALID_ID = 0xFF,            //ID reserved to indicate an invalid client connected  SYSCALL_WAIT_ON_EVENT = 0,    //Indicates there is no actual system call to make, but rather should jsut wait on an event};typedef struct syscall syscall_t;typedef struct thread thread_t;typedef struct init_block init_block_t;//This is the data structure associated with an initialization block from which //threads are spawned when dynamically loading themstruct init_block {  void* globals;  void (*init_ptr)(void*);  void* init_arg;  refcounter_t thread_counter;};//This is a system call data structurestruct syscall {  //***** next_call must be at first position in struct for casting purposes *******  struct syscall* next_call;        //Pointer to next system call for use in syscall queues when blocking on them  syscall_id_t id;                  //client id of this system call for the particular syscall_queue within which it is being held  thread_t* thread;                 //Pointer back to the thread with which this system call is associated  void (*syscall_ptr)(struct syscall*);   //Pointer to the the function that actually performs the system call  void* params;                     //Pointer to a set of parameters passed to the system call once it is running in task context};//This is a thread data structure//This structure is 43 bytes long...struct thread {  //***** next_thread must be at first position in struct for casting purposes *******  volatile struct thread* next_thread;  //Pointer to next thread for use in queues when blocked  thread_id_t id;                       //id of this thread for use by the thread scheduler  init_block_t* init_block;             //Pointer to an initialization block from which this thread was spawned  stack_ptr_t stack_ptr;                //Pointer to this threads stack  volatile uint8_t state;               //Current state the thread is in  volatile uint8_t mutex_count;         //A reference count of the number of mutexes held by this thread  void (*start_ptr)(void*);             //Pointer to the start function of this thread  void* start_arg_ptr;                  //Pointer to the argument passed as a parameter to the start function of this thread  syscall_t* syscall;                   //Pointer to an instance of a system call  thread_regs_t regs;                   //Contents of the GPRs stored when doing a context switch};enum {  TOSTHREAD_STATE_INACTIVE    = 0,  //This thread is inactive and cannot be run until started  TOSTHREAD_STATE_ACTIVE      = 1,  //This thread is currently running and using the cpu  TOSTHREAD_STATE_READY       = 2,  //This thread is not currently running, but is not blocked and has work to do   TOSTHREAD_STATE_SUSPENDED   = 3,  //This thread has been suspended by a system call (i.e. blocked)};#endif //THREAD_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -