标签 RTOS 下的文章
 2020-06-14T19:00:01.642000    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     938 views
Zephyr版本号:2.2.0开发板:STM32F429IGT6(野火STM32F429挑战者 V2开发板)开发环境:Windows 7 64位这里选择的是Zephyr当前最新的Release版本2.2.0进行说明的。当需要熟悉Zephyr的具体运行过程,那么调试就必不可少,例如在调试任务切换时,需要观察CPU状态以及各个寄存器的情况,此时图形界面下的调试更为方便。下面讲讲如何使用Eclipse搭配JLink来调试HelloWold应用程序。1、设置Eclipse环境(1).下载并安装Eclipse从Eclipse网站下载Eclipse IDE for C/C++ Developers,然后进行安装。下载网址:https://www.eclipse.org/downloads/packages/release/oxygen/2/eclipse-ide-cc-developers。(2).安装GNU MCU Eclipse插件打开安装好的Eclipse,在Help(或者Window)菜单下面找到Eclipse Marketplace,然后在Find输入框中输入GNU MCU eclipse,按Enter键进行搜索,找到GNU MCU eclipse插件之后,点击Install按钮,我这里之前已经安装好了,如下图所示:2、生成Eclipse工程确定命令提示符的路径在Zephyr2.2.0源代码目录中,执行下述命令来生成Eclipse的工程文件:west build -p auto -b stm32f429i_disc1 samples/hello_world -- -G"Eclipse CDT4 - Ninja"生成的Eclipse工程文件.project在build目录下。3、将工程导入到Eclipse打开安装好的Eclipse,在File菜单下面点击Import…,在弹出的窗口中选择General -> Existing Projects into Workspace,然后点击Next,然后添加Zephyr的build的路径,点击Refresh,选中添加的工程之后点击Finish:4、创建调试器配置文件工程导入完成之后,接下来配置调试器,打开菜单Run -> Debug Configurations...,在弹出的窗口中双击GDB SEGGER J-Link Debugging生成调试配置文件。Main标签页的配置:    Project:hello_world@build    C/C++ Application:zephyr/zephyr.elfDebugger标签页的配置:    J-Link GDB Server Setup:        Start the J-Link GDB server locally:取消勾选    GDB Client Setup:        Executable:arm-none-eabi-gdb.exeStartup标签页的配置:    Initial Reset and Halt:取消勾选    Enable semihosting:取消勾选    Enable SWO:取消勾选,如下图所示:Set breakpoint at: __startCommon标签页的配置如下图红色方框所示:5、运行调试器在使用Eclipse调试Zephyr之前,先打开JLink GDB Server,然后再点击Eclipse调试按钮下拉菜单的hello_world_build Configuration调试选项:点击调试按钮等一小会儿之后,出现了调试界面,惊喜吧:之后的步骤,就是自己动手调试代码啦。如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。
嵌入式RTOSZephyr 阅读全文»
 2020-05-15T21:50:16.848000    |      嵌入式学习    |     AilsonJack    |     2 条评论    |     1458 views
Zephyr版本号:2.2.0开发板:STM32F429IGT6(野火STM32F429挑战者 V2开发板)开发环境:Windows 7 64位这里选择的是Zephyr当前最新的Release版本2.2.0进行说明的。1、修改代码前面文章的操作,虽然在Windows下能够成功的编译STM32F429的工程,但是却不能在野火挑战者V2开发板上运行,因为Zephyr代码中的STM32F429硬件和野火的外围硬件不一样(其实CPU也有一些差异)。主要体现在外部晶振,时钟的配置以及MPU上面(野火挑战者V2开发板使用的CPU是STM32F429IGT6,不带MPU功能)。进入到boards/arm/stm32f429i_disc1文件夹中,然后修改文件stm32f429i_disc1_defconfig,需要修改的内容如下:CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=180000000CONFIG_ARM_MPU=nCONFIG_CLOCK_STM32_HSE_CLOCK=25000000CONFIG_CLOCK_STM32_PLL_M_DIVISOR=25CONFIG_CLOCK_STM32_PLL_N_MULTIPLIER=360在stm32f429i_disc1_defconfig文件的末尾,添加如下的内容(该内容的含义是编译出的代码不进行优化,这样便于调试):CONFIG_NO_OPTIMIZATIONS=y修改文件board.cmake,需要修改的内容如下:board_runner_args(jlink "--device=STM32F429IG" "--speed=4000")2、编译HelloWorld应用确定命令提示符的路径在Zephyr2.2.0源代码目录中,执行下述命令:west build -p auto -b stm32f429i_disc1 samples/hello_world编译成功的输出信息如下:3、下载程序到开发板确保Windows中安装了JLink驱动,并且将JLink驱动的路径(JLink.exe所在的路径)添加到系统环境变量的Path中。我这里安装的是Jlink V6.48a,其路径为:C:\Program Files (x86)\SEGGER\JLink_V648a。如果没有将JLink驱动的路径添加到环境变量中,下载程序时会出现类似的错误:FATAL ERROR: required program JLink.exe not found; install it or add its location to PATH。将开发板上电,连接好JLink调试器,连接好串口线并且打开串口调试助手,然后执行下述命令将程序烧写到开发板中:west flash --runner jlink程序下载成功之后,会在串口调试助手中打印出信息,如下图所示:4、使用GDB调试程序程序下载成功之后,执行命令:west debug --runner jlink(该命令会自动打开JLink GDB Server,不需要提前手动打开JLink GDB Server),可以使用GDB调试Zephyr,先前的镜像不能成功打印信息,我也是通过这个命令来调试Zephyr,最终定位时钟参数问题的。接下来的一篇文章,会讲述如何使用Eclipse来调试Zephyr,虽然也是使用的GDB,但是调试更加的方便,能够手动添加断点,添加观察的变量,随意切换文件,总之下面一篇文章很OK,敬请关注。如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。
嵌入式RTOSZephyr 阅读全文»
 2020-05-09T23:43:42.634000    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     1347 views
Zephyr版本号:2.2.0开发板:STM32F429IGT6(野火STM32F429挑战者 V2开发板)开发环境:Windows 7 64位这里选择的是Zephyr当前最新的Release版本2.2.0进行说明的,我的电脑是Windows 7 64位系统,对于其他版本的Zephyr,配置步骤应该差不多。在后续的文章中,我将在野火的挑战者V2开发板运行Zephyer,并讲解使用Eclipse和JLink调试Zephyer的方法。为了防止公开链接被和谐,文章所需资源,请关注博主公众号,发送关键字 "zephyr开发环境" 进行获取。1、安装ChocolateyChocolatey的安装可参考我的博文:Chocolatey离线安装方法,当然安装好了的就请忽略。2、安装依赖使用Chocolatey安装指定工具时,如果电脑中已经存在了该工具,可选择不安装该工具。(1).以管理员身份打开命令提示符(按Windows键,在提示符下键入“cmd.exe”,然后右键单击结果并选择“以管理员身份运行”)。(2).禁用全局确认,以避免必须确认单个程序的安装:choco feature enable -n allowGlobalConfirmation(3).安装Cmake:choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'安装完Cmake之后,记得将C:\Program Files\CMake\bin(Cmake的默认安装路径)添加进系统环境变量的path中。(4).安装其余工具:choco install git python ninja dtc-msys2 gperf(5).安装west:首先关闭之前的管理员命令提示符窗口,然后打开常规命令提示符窗口(不要有管理员权限的命令提示符窗口),接着执行命令:pip3 install west。3、获取Zephyr-2.2.0源代码Zephyr的多用途west工具简化了获取Zephyr源代码和Zephyr需要使用到的外部模块。使用west 将Zephyr的所有git存储库克隆到新目录zephyr_new中。选择一个存放Zephyr的目录,然后在此目录中打开命令提示符,执行下述命令:west init zephyr_newcd zephyr_newwest update如果执行完west update命令之后,出现类似错误:ERROR: update failed for projects: civetweb, hal_stm32,那么再执行一次west update命令应该就可以了:切换到2.2.0代码的分支:cd zephyrgit checkout -b v2.2-branch origin/v2.2-branch4、安装所需的Python软件包我们下载的Zephyr源代码中包含一个requirements.txt文件,我们将使用该文件来安装Zephyr项目使用的其他Python工具:pip3 install -r scripts\requirements.txt5、安装软件开发工具链工具链包括用于构建Zephyr应用程序的必要工具,包括:编译器,汇编器,链接器及其依赖性。由于这里将使用STM32F429IGT6,因此下载安装ARM工具链即可。在https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm下载编译工具链,或者使用我这里提供的下载好的编译工具链,我使用的是2019q4。解压"gcc-arm-none-eabi-9-2019-q4-major-win32.zip",重命名为2019q4,我这里的存放路径为:F:\SoftWare\linux_enviroment\gnu_tools_arm_embed\2019q4。环境变量设置:(1).在系统变量下面点击新建,变量名:ZEPHYR_TOOLCHAIN_VARIANT,变量值:gnuarmemb。(2).在系统变量下面点击新建,变量名:GNUARMEMB_TOOLCHAIN_PATH,变量值:F:\SoftWare\linux_enviroment\gnu_tools_arm_embed\2019q4。(3).将编译工具链的路径(F:\SoftWare\linux_enviroment\gnu_tools_arm_embed\2019q4\bin)添加到系统环境变量的Path中。添加完上述环境变量之后,记得保存。6、编译HelloWorld应用确定命令提示符的路径在Zephyr2.2.0源代码目录中,执行下述命令:zephyr-env.cmdwest build -p auto -b stm32f429i_disc1 samples/hello_world编译成功的输出信息如下:当然了,当前编译出的二进制文件并不能在野火挑战者V2上运行,后续的文章会讲解如何修改代码使Zephyr能够在野火挑战者V2运行。敬请关注。如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。
嵌入式RTOSZephyr 阅读全文»
 2016-04-02T22:23:40.457000    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     3715 views
最近看了看preempt-rt的一些材料,觉得网友的总结还是可以,这里就分享出来供大家学习之用,总结的几个preempt-rt关键点如下:1、preemptible critical sections1.1 用支持PI的rt_mutex代替传统的禁用抢占的spin_lock,定义了新的数据类型:spin_lock_t。凡是使用spin_lock_t做参数的spin_lock函数行为有可能引起调度,不会禁用抢占。如果,希望使用传统的spin_lock,则需要使用raw_spin_lock_t类型作为参数。1.2 同时,要注意per CPU变量的问题,以前用spin_lock保护的per CPU变量,现在会出现问题,即在现在的spin_lock中进程照样会睡眠,然后调度到别的CPU上。因此,引入了一个新的宏来定义一种可以锁住的per CPU变量。DEFINE_PER_CPU_LOCKED,就是这样的宏,通过get_cpu_var_locked来操作per CPU变量。不过,以前使用get_cpu/put_cpu保护的per CPU变量不受影响。1.3 还有一种情况,就是在显示的改变的进程状态之后,调用spin_lock,参考下面的代码序列:spin_lock(&mylock1);    current->state = TASK_UNINTERRUPTIBLE;    spin_lock(&mylock2); // [*]        blah();    spin_unlock(&mylock2);spin_unlock(&mylock1);在锁住mylock2之前,进程被设置为TASK_UNINTERRUPTIBLE状态,但是现在spin_lock的行为与mutex一样,所以当获得mylock2的时候,进程有可能被设置为TASK_RUNNING状态,则与前面的逻辑相矛盾。所以,引入了TASK_MUTEX_RUNNING状态。这样,代码会选择将进程状态设置为以前的状态还是TASK_RUNNING。2、preemptible interrupt handlers在preempt-rt环境下,中断处理程序是运行在进程上下文中的,这与传统情况大相径庭,所以处理上有很多需要注意的地方。大概的过程是,redirect_hardirq唤醒某个中断处理程序(实际上是一个进程),然后交由do_irqd在进程上下文中执行。如果,希望某个中断处理程序继续运行在中断上下文中,需要将该中断处理程序设置为SA_NODELAY。在这种情况下,任何于进程上下文的互斥都要使用raw_spin_lock_t来处理。3、preemptible “interrupt disable” code sequence在preempt-rt环境下,spin_lock_irqsave并不会禁用中断和抢占,而且local_irq_save也不会禁用中断,只会禁用抢占。必须与SA_NODELAY类型中断打交道的代码不能使用local_irq_save,因为它不会真正禁用中断,此时,必须使用raw_local_irq_save。4、priority inheritance for in-kernel spinlocks and semaphore对于preempt-rt中的spinlock来说,实现都是支持PI的rt_mutex,即能够解决优先级翻转问题。优先级翻转是实时系统中比较严重的问题,具体成因是:进程A,B,C,其中优先级A>B>C。C持有锁S,A需要S,则A睡眠在S上,但是B抢占C,则A只有等到B运行结束,C释放S后才能继续运行。这样就造成了优先级翻转问题。解决办法是,在A尝试获得S的时候,判断持有S的进程与A的优先级,如果A的优先级更高,则提升C的优先级与A一样高。如果,C还依赖于某一个锁,这样循环下去,则需要循环提升持有锁的进程的优先级。当C释放S时,恢复C的优先级。一旦,C释放S,则A尝试获得S,这时S在pending状态,这时,更高优先级的进程可以尝试抢占A,否则A将彻底获得S。这种优化通过在spin_lock_t中加入task_struct指针实现,指针的低两位作为锁的状态位。在pending向held状态转化过程中,是更高优先级进程“steal”锁的时机。在这个例子里面,A就是S的top waiter。针对于读写锁,由于依赖情况比较负责,preempt-rt做了简化,即只容许一个进程在一个时间持有一个读锁。但是,这里面也有例外,某些用于同步的semaphore,不能执行PI,因为,不知道哪个进程持有这个semaphore,所以无法比较优先级。这种情况需要使用compat_semaphore或者compat_rw_semaphore代替。5、deferred operations由于spin_lock可以睡眠,因此在禁用抢占期间代用spin_lock是非法的。在这种情况下preempt-rt提供了一些解决办法:put_task_struct_delayed排队put_task_struct稍后执行;mmdrop_delayed排队mm_drop稍后执行;TIF_NEED_RESCHED_DELAYED执行重调度,在进程准备返回到用户空间时,或者直到下一个preempt_check_resched_delayed。6、latency-reduction measurespreempt-rt中还有一些改变的主要目的是减少调度或中断延迟。第一个例子是x86的MMX/SSE硬件。这些硬件在内核中处理时禁用抢占,需要等待前面的指令完成,但是一些指令执行时间很长,preempt-rt做了改变。第二个例子是使用slab分配器分配per CPU变量。
Linux内核学习操作系统RTOS 阅读全文»
  • 1

  本站信息

目前本站共被浏览 154800 次
目前本站已经运行 3306 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号