线程和定时器

一:多线程

 

1,NSThread创建线程

 

  a,NSThread的类方法创建线程

   [NSThread detachNewThreadSelector:@selector(doing) toTarget:self withObject:nil];

 

 withObject 参数 下面几个方法类似

 

  b,构造方法创建线程需要start

 

   NSThread *th=[[NSThread alloc]initWithTarget:self selector:@selector(doing) object:nil];

    

 

        [th start];

 

 c,View创建

   [self performSelectorInBackground:@selector(doing) withObject:nil];

 

 

 

 

2,Operation创建线程

 

   a,Operation创建线程

   

//创建 Operation队列,add创建
NSOperationQueue *queue =[[NSOperationQueue alloc]init];
    
        [queue addOperationWithBlock:^{
    
           //执行方法
        }];

 

b,Operation启动多个线程,可设置线程的优先级

NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImage:) object:@"1"];
    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImage:) object:@"2"];
    
    
    [operationQueue addOperation:operation1];
    [operationQueue addOperation:operation2];

 

 

 

3,GCD创建线程

   

  dispatch_queue_t queue=dispatch_queue_create("baihe", nil);
    
    dispatch_async(queue, ^{
      
    });

 

 

 

二:定时器

 

看下面的定时器操作

 [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(doing) userInfo:nil repeats:YES];该语句可能不会输出 ,可能会被return

 

解决办法://获得当前线程,防止被return,无法执行

    [[NSRunLoopcurrentRunLoop] run];

 

一般不在主线程中执行定时操作,开启线程使用自动释放池操作

 /**
     TimerInterval : 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法
     
     target : 需要执行方法的对象。
     
     selector : 需要执行的方法
     
     repeats : 是否需要循环
    */
    
    @autoreleasepool {

   NSTimer *timer=
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(doing) userInfo:nil repeats:YES];

        //RUNLoop管理定时器
//        [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
        

    //获得当前线程,防止被return,无法执行
    [[NSRunLoop currentRunLoop] run];
    
    
//    [timer invalidate];//停止定时器

 

 

 

 

在操作系统嵌入式系统中,**线程****定时器中断**是两个常见的执行单元。它们的**优先级关系**直接影响任务调度、响应时间系统稳定性。 --- ## 一、线程与中断的基本概念 ### 1. 线程(Thread) - 是 CPU 调度的基本单位; - 运行在**进程上下文**中; - 可以被操作系统调度器调度抢占; - 具有优先级(例如在实时操作系统中); ### 2. 定时器中断(Timer Interrupt) - 属于**硬件中断**,由定时器触发; - 运行在**中断上下文**中; - 具有**中断优先级**,在嵌入式系统中通常由中断控制器(如 NVIC)管理; - 不可被调度,但可以嵌套其他中断(取决于优先级配置); --- ## 二、线程与中断的优先级关系 | 执行单元 | 所处上下文 | 是否可被抢占 | 优先级机制 | 典型系统 | |----------|------------|----------------|-------------|-----------| | 线程 | 用户态/内核态 | ✅ 可被中断抢占 | 线程优先级(调度器) | Linux、RTOS | | 定时器中断 | 中断上下文 | ❌ 不可被线程抢占 | 中断优先级(硬件) | RTOS、嵌入式系统 | ### ✅ 总结: - **中断优先级 > 线程优先级** - 无论当前线程的优先级多高,只要中断触发,CPU 会立即响应中断服务程序(ISR); - 在中断处理完成后,系统再回到被中断的线程继续执行; --- ## 三、在嵌入式系统(如 FreeRTOS)中的优先级配置 以 **FreeRTOS** 为例,系统中线程优先级中断优先级是分开管理的: ### 1. 线程优先级 - 范围:0 到 configMAX_PRIORITIES - 1(默认为 5) - 数值越大优先级越高(可配置) ### 2. 中断优先级(NVIC) - 范围:0 到 255(ARM Cortex-M 系列) - 数值越小优先级越高(通常) - 在 FreeRTOS 中,中断服务函数中不能调用会阻塞的 API(如 vTaskDelay) --- ## 四、代码示例(FreeRTOS 中设置中断线程优先级) ### 1. 创建线程并设置优先级 ```c void vTask1(void *pvParameters) { while(1) { // 执行任务逻辑 vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时1秒 } } // 创建线程 xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); ``` ### 2. 配置定时器中断(以 STM32 HAL 为例) ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htim2) { // 定时器中断处理逻辑 } } // 启动定时器中断 HAL_TIM_Base_Start_IT(&htim2); ``` ### 3. 设置中断优先级(NVIC) ```c NVIC_SetPriority(TIM2_IRQn, 1); // 设置中断优先级为1(数值越小优先级越高) NVIC_EnableIRQ(TIM2_IRQn); ``` --- ## 五、注意事项 1. **中断服务程序(ISR)应尽量短小精悍**,避免长时间占用 CPU; 2. 在 ISR 中调用 FreeRTOS API 时,需使用带 `FromISR` 后缀的版本(如 `xQueueSendFromISR`); 3. 中断优先级不能低于某个阈值(如 FreeRTOS 使用 `configMAX_SYSCALL_INTERRUPT_PRIORITY` 来限制); 4. 线程优先级与中断优先级不可直接比较,因为它们属于不同的调度机制; 5. 高优先级中断可以打断低优先级中断(中断嵌套),但线程永远不能打断中断; --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值