自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 freertos韦东山---事件组以及实验

事件组的原理是什么,有哪些优点,为啥要创造出这个概念。

2025-04-06 21:40:55 345

原创 freertos韦东山---信号量实验

实验挺简单的就是熟悉一下二进制型,计数型信号量的创建函数,take和give函数的用法。二进制型,计数型信号量的创建函数不同,take函数,give函数是一样的。ps:小车顺序有的是312,up的123是因为先运行的music函数。二进制型,计数型信号量的创建函数又分为静态用法和动态用法。take函数就是计数值减一,give函数就是加一,take函数,give函数又分为中断用法和普通用法。

2025-04-06 11:35:45 111

原创 freertos韦东山---信号量

信号量最大为1时,也可以当做互斥量做互斥操作。

2025-04-06 10:32:00 250

原创 freertos韦东山--赛车游戏

然后就是执行car_game函数,会创建三个car_task任务,这些任务会轮着执行,每次执行都会调用car_task函数,将自己独特的位置参数x,y以及key_control传入函数,创建自己的队列并注册。为了解绑底层代码和应用的关系,也就是解耦,以后如果不是汽车了而是猫狗老鼠,就不是车的结构体里的x y key 了,就要改这些底层代码,为以后方便现在就麻烦点。data里的信息的队列都可以注册进去,ir底层写队列的时候,每个队列都会写入相同的dev 和val值。,因此这个数组实际上被初始化为全零字节。

2025-04-05 14:03:10 289

原创 freertos韦东山---添加MPU6050控制

但是屏幕和mpu6050可能会同时使用屏幕资源,所以用同一个全局变量保护lcd刷新函数和mpu6050读函数防止同时访问lcd资源。一,创建mpu6050任务(iic通信,写队列)(因为没有中断,所以用任务写队列)1,任务创建的位置,在game1里,否则句柄写不进队列集。队列的数据传输是互斥的不用担心影响。

2025-04-01 23:01:08 112

原创 freerotos韦东山---队列集(修改框架)

处理函数就是,将读到的句柄的队列(红外队列或者旋转队列)里的数据写入临时结构体,根据临时结构体的val值,将input结构体里的val写0 1 2,再将input结构体写入挡球板队列里。在game1_task函数里创建input 队列,队列集,获得句柄将其加入队列集,input任务。最后就是读挡球板队列的值,将val值(0,1,2)赋给uptMove,让它执行挡球板移动的动作。第二步创建队列集,input队列并将所用队列加入队列集,input任务。别忘了,在,h声明一下,这个函数是要被外界调用的。

2025-03-29 19:26:15 358

原创 freertos韦东山--队列集

当为了完成一个任务时(任务中通常由他的队列传输数据),如果直接通过相关驱动程序编写这个队列来完成这个任务,当想完成的任务改变时,驱动程序里代码是和任务有关的,也要变,这样做不好,驱动程序是会被不同的任务使用的,就像driver_my iic不应该和任务有关。所以韦哥建议用另一个任务(队列),作为中间量,驱动函数写这个队列,任务2读队列后再写进目标任务的队列,所以当任务改变时,只用改变任务2换个队列写就行,但是每多用一个方式去完成目标任务就会浪费桟空间,所以就引出了队列集。的机制,其核心功能在于允许任务。

2025-03-25 21:05:08 268

原创 freertos韦东山--旋转编码器

大条了,想加个旋转编码器硬件,但是在cubemx一添加新的管脚,重新生成代码就会导致原来的代码不能运行,一动编码器屏幕就会卡住。按照这个思路去完成和红外一样,不同的地方是rotary_task里,读队列B,处理数据,写队列A,的程序编写。创建静态队列记得第四个参数static StaticQueue_t 没有*

2025-03-17 20:59:05 163

原创 freertos韦东山--红外buffer改队列传输

2,写队列和读队列函数的让传入的数据指针,这里传的是结构体的指针,他是在函数里定义的,只是临时变量,它只是用暂时中转数据不是队列的buffer,后面就放到了全局变量的那个结构体(这也是队列真正传输数据的地方),为了方便,这些结构体的名字和内容一样,但是作用不一样。先在挡球板任务里创建队列,后面将while里读buffer改为读队列(写程序的顺序和执行程序的顺序是反的,有点反直觉)1,我用的vet6不是c8t6,只移植了nwatch文件夹里的函数,也可以使用。在哪被调用的就不知道了。回调函数的核心特性是。

2025-03-16 13:24:56 135

原创 freertos韦东山--多设备玩游戏思路

improve3:如果写队列的任务比较复杂,在中断中进行这一动作会影响其他中断,所以改善为写另一个队列B,再创建一个encoder任务去读队列B,再将数据处理后写入队列A,然后再由read函数去读队列A,(绕了一圈就是为了优化控制效果,同时减小不好影响)原本是通过红外,红外驱动中断程序(ISR)将数据(键码)写入环形buffer(环形缓冲区),通过ir_read函数读环形buffer数据,这种方法无阻塞,低效率。原代码,首先创建了一个game1任务,这个任务里创建了第挡球板任务同时运行球移动的函数。

2025-03-15 23:11:10 172

原创 freertos韦东山--数据传输

队列是一种线性存储结构,遵循“先进先出”原则,数据从队尾进入,从队头退出。(注意和栈不一样,

2025-03-15 20:06:59 754

原创 freertos韦东山--互斥和同步通信

有两种方法,1是开关tick中断,但是会使cpu利用率变低和上个程序while循环死等一样,因为虽然中断关闭,但是还是会不断循环申请cpu使用权。为了防止多个任务同时使用lcdprint函数,造成iic信号混乱,可以全局变量或者小技巧,但是终归有失误的几率。第二种是事件驱动,由b进不去后自动进入堵塞状态,等a任务结束后唤醒b任务,然后a堵塞,b结束后把a唤醒。为了防止非原子操作的小bug。

2025-03-10 22:38:07 140

原创 freertos韦东山--同步互斥与通信1

两个函数要共享的变量是time sum和标志位clacend,他们都要是全局变量,注意标志位clacend前面加volatile不然会被优化,导致程序卡在判断标志位的while(clacend==0)里.g_lcdcanuse标志位的判断可以没有,因为到clacend标志位差不多已经可以让两个任务的打印函数不互相影响了,最后实验发现time就差1ms。2,任务之间配合协作完成特定功能,比如一个采集数据一个处理数据,要先采集再执行才不会乱。互斥是指两方的状态,同步是方法,动作,经常使用同步的方法实现互斥。

2025-03-10 21:47:36 87

原创 freertos韦东山--两个delay函数

pretime只用执行一次,目的是把时间参数传进去,后面堵塞和ready转换的时候会自动更新为,切换时刻。ps:xtaskdelayuntil()或者vaskdelayuntil()一个事延时指定时间,总体时间>=指定的时间,但是总体时间不定。另一个可以保证固定的周期运行。后面就是验证一下这两个函数,

2025-03-09 22:00:35 206

原创 freertos韦东山--任务管理与调度3

当所以其他任务都被放入阻塞链表(delay链表)中,空闲任务才有机会去收尸,所以尽量所有延时函数都要用vtaskdelay。因为返回值会返回到taskexiterror函数,会关闭所有的中断,也就没了tick中断,不会发生任务调度了。由于默认任务自动创建的空闲任务优先级最低0,不会被执行,那该怎么去释放被删除任务的tcb等。空闲任务里可以调用hook函数(可自由编辑的函数),在空闲任务被执行是顺便执行一下。传入任务的函数,执行完成后(非while循环),不会返回,返回值。ps:延时函数不要用死循环。

2025-03-09 21:01:03 136

原创 freertos韦东山--任务管理与调度2

列表个数最大值是56,freertos遍历列表的方式是,从上到下,从左到右,先查看优先级最高的列表,相同列表里面的任务都是一个级别的,然后往下。高优先级的任务一旦创建就会被立马运行,faulttask任务有delay,会被从readay链表删除,被放到delay链表里。在tick中断1ms中断里,每次时间到了就会从上到下遍历一次,执行一次任务,再遍历。ps:暂停链表不能通过tick中断放入ready链表中,只能通过resume函数。vtaskdelay的参数是tick个数。任务管理和任务调度的核心是链表。

2025-03-09 20:06:48 150

原创 freertos韦东山--任务状态与调度理论

只是讲了,四种任务状态,以及转化(也就是几个api函数),后面任务多了应该会有就绪列表,挂起列表类的来管理。有时候按键不灵敏,可能是重复码没处理,加个延时会好些。

2025-03-09 17:41:46 165

原创 freertos韦东山---任务删除

在接收红外函数里根据收到的按键码执行创建和删除任务,注意这里不同遥控器的按键对应的键码可能不同,我的播放时0x22,暂停是0xa2,IRReceiver_Read(&dev,&data)判断是否收到信号命令,收到返回值是0,没有是1,这是写好的不用管怎么写的。接下来就是初始化lcd,清屏添加一些打印信息,在打印信息前注意清除原来的字,清屏操作。注意删除任务后,把句柄=null,句柄默认值应该是null。删除,挂起,等等操作都能通过句柄来完成,这就是句柄的用处。删除音乐任务后,暂停蜂鸣器,为什么呢。

2025-03-04 23:01:57 168

原创 freertos韦东山--使用相同函数创建不同的任务

通过将这些不同的信息作为参数传递给 LcdPrintTask 函数,使得同一个函数可以在不同的任务中使用。• 函数内部传参:是在任务函数内部,将已经从 xTaskCreate 传递进来的参数进一步传递给其他函数,用于完成具体的功能,是函数调用级别的参数传递。xTaskCreate 传参:是在创建任务时,将不同的任务数据传递给任务函数,用于区分不同任务的特性和需求,是任务级别的参数传递。然后定义三个类型为TaskPrintInfo的任务的不同参数的结构体用于给不同的任务传参(位置不同和打印信息不同)。

2025-03-02 21:37:08 202

原创 freertos韦东山--估算栈的大小

最精确的是看反汇编函数也可以看c函数大致估算一下。

2025-03-02 10:01:35 96

原创 freertos韦东山--创建任务

任务:函数+栈+TCB(任务控制块)+优先级tcb是任务链表的一个节点或者说一个元素,为了管理任务创建任务动态创建任务:指定栈大小自动分配空间静态创建任务:指定unsigned basetype_t 的buffer作为栈,大小在前面参数depth指定创建声光色影四个任务这行代码的确是使用typedef关键字为void *类型创建了一个新的别名。自此之后,就和void *一样属于通用指针类型,在代码里可以用来声明通用指针变量,就像使用void *声明变量一样。使用。

2025-03-02 09:41:53 790

原创 freertos韦东山--栈

在多线程或多进程程序中,一个线程或进程可能会修改某个共享变量的值,而其他线程或进程需要及时感知到这种变化。可以确保每个线程或进程在使用该变量时都从内存中读取最新的值。本身并不能保证线程安全,对于复杂的多线程操作,还需要使用同步机制(如互斥锁)。的 ASCII 码值(十进制为 65),从 0 到 25 依次递增,所以。出栈,入栈,栈顶,栈底。volatile前缀。

2025-02-28 19:49:10 155

原创 freertos韦东山-堆(链表)

链表是为了解决数组不易管理元素而出现的链表由一个个元素(节点)构成,每个节点包括两个域,数据域(保存的数据),指针域(上一个或下一个节点的地址)链表分为单向链表,双向链表,单向循环链表,双向循环链表,带头,不带头链表(单向,只有下一个节点的地址,双向,有上一个和下一个两个节点地址循环是头节点和尾节点相互连接带头链表的目的时排除添加新节点时插入到头节点之前导致头节点变化的情况,头节点,首节点,尾节点,头节点不保存任何数据)创建一个基本列表

2025-02-28 15:12:32 192

原创 韦东山freertos-反汇编代码

3.1把r0,r1,lr(存的返回地址0x08002a32+4)的值分别从右到左push(压)到栈里,从栈顶顺序往下,此时sp在栈顶的地址变成sp_inital-12,sp一直指向栈顶也就是会不断减小。PC<--LR(及返回地址),pc为程序寄存器,它存储着下一条要执行的指令的地址,会跳转到add函数的下面。3.3,再把栈里从sp+4开始的的8个字节的数据也就是r0和r1分别写入到r0和r1寄存器中。指令则是从栈中取出数据,并将其存储到指定的寄存器中。3.2,sp,sp,#4此时把sp向上移动4个字节,

2025-02-27 22:39:20 219

原创 freertos 韦东山,创建第1个多任务程序

2,作为系统,操作抽象的同时更加直接方便,利用创建一个个任务完成想要的动作,忽略底层(类比window电脑,鼠标点几下就能创建文件,删除文件)1,利用cubemx工具可以用hal快速配置初始化,包括gpio,iic等等。3,更容易管理不同的任务,不和逻辑那么乱都在一个while循环里。freertos系统对比裸机的优点是。

2025-02-27 19:18:56 65

原创 学习韦东升freertos的基础知识点

如果不清楚变量前缀的具体意思,很容易看不懂代码。

2025-02-27 18:57:16 76

原创 stm32l151c8t6标准库例程

csdn上好像很少免费的stm32l151c8t6标准库例程,找了好久在正点原子论坛以前的贴子上找到的,打包了一下,包括例程,固件库,和芯片包。链接:https://pan.baidu.com/s/1163R10GTEiUnaeRlT54t1A?

2024-07-04 15:23:30 296

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除