切换到宽版
  • 1125阅读
  • 14回复

[ARM]STM32 ARDUINO HALMX  应用(七) 基本定时器库 [复制链接]

上一主题 下一主题
离线nan77240

发帖
282
M币
24
专家
2
粉丝
16
只看该作者 10楼 发表于: 06-23
回 huaweiwx 的帖子
huaweiwx:1  这个正对 AVR系列的,avr芯片有内置eeprom,但stm32 大部分芯片是不带内置eeprom的,所以没有eeprom.h,这个头文件, 即使有,也是用内部flash模拟的,如果板子上有i2c eeprom,建议使用,如容量不够,可以换个大一点的。
2 库调用了io,这是和硬件有关的,也需要 .. (2018-06-22 23:07) 回 huaweiwx 的帖子

了解了   谢谢大神回复  小东西太复杂就换没必要死磕
离线chengbao

发帖
16
M币
695
专家
0
粉丝
4
只看该作者 11楼 发表于: 07-11
小弟初学者,刚接触单片机用RTOS 照葫芦画瓢,建立了A/B两个线程,设置同等任务优先级。 开发环境:基于STM32 的 arduino
现在有个问题,我在“”B线程“”里面其中有几条指令要求在执行的时候不能切换任务实(实际就是单片机一个引脚拉高、延时、拉低  发出一个脉宽0.5us的高电平脉冲),现在通过示波器观察  出现的问题是B线程中脉冲引脚被置高后CPU被切换到执行A线程去了,然后再切换回来吧脉冲引脚拉低,导致脉宽完全不可控。程序这块小弟完全新手,还望前辈不要笑话指点一二。拜谢!!!
离线huaweiwx

发帖
1235
M币
2781
专家
53
粉丝
232
只看该作者 12楼 发表于: 07-11
chengbao:
小弟初学者,刚接触单片机用RTOS 照葫芦画瓢,建立了A/B两个线程,设置同等任务优先级。 开发环境:基于STM32 的 arduino
现在有个问题,我在“”B线程“”里面其中有几条指令要求在执行的时候不能切换任务实(实际就是单片机一个引脚拉高、延时、拉低  发出一个脉宽0.5us的高电平脉冲),现在通过示波器观察  出现的问题是B线程中脉冲引脚被置高后CPU被切换到执行A线程去了,然后再切换回来吧脉冲引脚拉低,导致脉宽完全不可控。程序这块小弟完全新手,还望前辈不要笑话指点一二。拜谢!!!


大致是这样的构架:

static void TaskB(void __attribute__ ((unused)) *argument){
  {
   //任务B初始化部分

   }

//任务主循环
  for(;;)  {
    {
  //允许切换部分
    }


//  在进入那段不能切换任务的代码前先阻塞其他任务

    vTaskSuspendAll();  //阻塞
   {
        // 不能切换任务的代码
    }

     xTaskResumeAll();  //解除阻塞

    {
  //允许切换部分
    }


    vTaskDelay(200);       // 留出足够时间片让其他任务执行
  }//end for
}//end TaskB

要说明的是:
在  vTaskSuspendAll();  //阻塞
和   xTaskResumeAll();  //解除阻塞 中的那段 :
      // 不能切换任务的代码
中,如有延时需求不能用 vTaskDelay(),因为这是交出时间片去执行其他任务,要用自己写的延时或arduino延时 delay函数;
否则 在阻塞状态又交出控制权,就进死机了,因为此时任务调度处于暂停状态;


[ 此帖被huaweiwx在2018-07-11 23:30重新编辑 ]
离线chengbao

发帖
16
M币
695
专家
0
粉丝
4
只看该作者 13楼 发表于: 07-12
回 huaweiwx 的帖子
huaweiwx:大致是这样的构架:
static void TaskB(void __attribute__ ((unused)) *argument){
....... (2018-07-11 22:39) 回 huaweiwx 的帖子

感谢指点,我去试试
离线chengbao

发帖
16
M币
695
专家
0
粉丝
4
只看该作者 14楼 发表于: 07-12
回 huaweiwx 的帖子
huaweiwx:大致是这样的构架:
static void TaskB(void __attribute__ ((unused)) *argument){
....... (2018-07-11 22:39) 回 huaweiwx 的帖子


//加载脉冲
vTaskSuspendAll();//调度锁开
    gpio_write_bit(GPIOA, 12, HIGH);
    for(int i=0;i<6; i++)
    {
    __asm__("nop\n\t");
    }
    gpio_write_bit(GPIOA, 12, LOW);
xTaskResumeAll();//调度锁关

麻烦前辈给看看是这样吧。我试了下好像可以工作。  其实我这样做的目的是A线程为MODBUS通讯,B线程做其他逻辑控制,B线程循环周期1-1.5ms左右,如果放到一起的话会影响B线程整体的循环周期,不知道除了上系统还有其他办法实现吗?

楼主留言:

这样核心代码不会打断,但你仍需要留出时间让A线程处理modbus的通讯;
而实时通讯也不希望打断,可以在通讯的核心代码处阻塞其他进程;
可以利用freertos建立个信号,来指示何时处理通讯,协调进程,实时要求高的话,还是建议用freertos;

快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个