学车记

学车记

学车到现在已经接近尾声,拖了两年之久的事情终于要有点眉目了。现在只剩下最后的理论—-科目四的考试了,这个考试应该也和科目一的理论差不多,只是最后多了五道多选题而已。现在回想起来,暑假,寒假,寒假,多少时间花在这个上面。断断续续不知道是福还是祸,考试从人监考一直到现在红外线考,变化多多,训练的方法也变化多多。

之前一个寒假我记得当时考试,倒桩和小路考是分开考的,而今年寒假回来就变成一起考了。以前小路考还考单边桥,而现在不见了。以前小路考是一次性,如果通过就通过,现在是有两次机会,第一次不过还有第二次机会。总之里面的变化任谁也搞不清楚。反正这些也不管了,都是过去的事情了。

下面就做一些记录,这是我一边学车,一边记录下来的:

小路考

上车,安全带(安全带不能带反,因为车上有感应装置,如果安装反了感应不到就是不及格)
起步(不能停顿超过30秒),左方向灯
侧方停车位,开车到看到左边后视镜看见库一角,一圈方向,倒档,车身与库对角线齐平,返回一圈方向,看右后轮胎,快进库时,反方向打死方向盘,进库,出来时方向灯
s路,直着进弯道,看黄线到车头三分之一处一圈方向,车走正了,返回一圈方向,然后
坡上定点停车与坡道起步,车尽量往右边靠30cm,车头要在停止范围内,起步方向灯
直角转弯,反光镜到黄线齐平,打死方向
倒车入库,到黄线打死方向,看左反光镜,车声0.5米,返回半圈方向,看车身与黄线平行,将方向放正

大路考

上车,安全带,座椅,踩离合,空档发动,大车灯,方向灯切换一下(后来分完车,车上教练教了一个好办法:上车1.空档 2.发动 3.大灯 4.方向 下车1.方向 2.大灯 3.熄火 4.挂一档,正好完全相反)
报告考官,灯光仪器正常,请求起步
方向灯,远近大灯,左右反光镜,挂一档,松离合,松手刹。
挂二档
靠边停车,转向灯,减速
下车,右转向,空档,手刹,关大灯,关方向,熄火,挂一档,松安全带,看反光镜,后面车,下车

总之上面就是这些天反复练习的东西,就这么多。考试也就这么多。

海美迪Q11解决DTS AC3播放问题

海美迪Q11解决DTS AC3播放问题

Q5、Q11、HD600A硬件配置几乎相同,软件可通用,而Q5是支持DTS、AC3解码的,遂下载了Q5双核和q11双核的最新固件对比,在system目录下文件对比,Q5只是多了:

libHA.AUDIO.DOLBYPLUS.decode.so
libHA.AUDIO.DTSHD.decode.so

这两个文件,故怀着试一试的心态,想将Q5这两个文件放到q11的系统里面,结果大吃一惊,完美播放!哈哈!下面分享成功经验,请大家非喜勿喷,谢谢!

  1. 首先,ROOT Q11,这样才能读写system目录。感谢fxxlwb大侠提供此Q11专用ROOT工具!坛里有下载,具体操作请查阅他的帖子。

  2. 然后,去coolapk.com市场下载“rootexplorer”,安装。

  3. 将我提供的“DTS_AC3.zip”文件解压缩出两个文件复制到U盘或SD卡,插到Q11上
  4. 运行“rootexplorer”点选这两个文件,选择“复制”,再到/system/lib目录下选择“粘贴”,再点确定。

  5. 最后,在系统设置的“声音”,将“HDMI输出”改为“解码”,这点很重要,不止HDMI能输出声音,就连AV端子接的电脑2.1音箱也能出声音了。

好了,试试你的高清1080P电影,看看是否有了惊喜?

来源:海美迪论坛

Lua接口学习

今天在程序里面使用lua_call,导致程序没有任何错误提示直接退出,找了好久原因,才知道lua_call不是一个受保护的方法,如果其中发生错误,会导致宿主程序直接退出

直到看到这篇文章才恍然大悟:最后查看官方文档,更换使用了lua_pcall。没有错误的问题真心可怕啊。。。

为何使用lua_atpanic
当调用无保护的lua_call后,如果调用栈发生错误(lua_error),那么默认行为是直接退出宿主程序。(可以参考这篇文章)
要避免这样的情况,一种方法是定义自己的panic函数,并作为参数调用lua_atpanic;此外为了避免退出宿主程序,自定义的panic函数应该永不返回(通常是做一个长跳转,令其跳转至lua_call调用点,不过这种做法几乎与lua_pcall无异)
lua_atpanic 1. lua_atpanic设置新panic函数并返回旧的panic函数。
2. 当在无保护环境下发生错误,lua调用当前的panic函数并呼叫exit(EXIT_FAILURE)退出宿主程序。
3. 我们可以提供自己的panic函数以避免退出宿主程序。(一种方法是做一个长跳转(long jump))
4. panic函数可以访问位于栈顶的错误讯息。
示例

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>
#include <setjmp.h> static jmp_buf jbuf; int
    panichandler(lua_State *L)    
    printf("%s\n", lua_tostring(L, 1));
    lua_pop(L, 1);
    longjmp(&jbuf, 1);  
}
int main(int argc, char *argv[])
lua_State *L;
int ret = 0;
if ((L = lua_open()) == NULL) {
    printf("lua_open() failed!\n");
    return 1;
} luaL_openlibs(L);
lua_atpanic(L, panichandler);
if (luaL_loadfile(L, "main.lua") == 0) {  
      if (setjmp(&jbuf) == 0)   /* first jmp */
          lua_call(L, 0, 0);    
      else                      /* second jmp, error */
          ret = 1;      else
      ret = 1; lua_close(L);
    return ret;
}



luaL_checkxxx和luaL_argcheck内部调用luaL_error,luaL_error内部调用lua_error,在调用lua_error前会格式化错误信息压入栈顶,最后调用lua_error,lua_error不会返回,而是做一个长跳转。所以在C函数中使用return luaL_error也不会返回,而是跳转到调用lua_pcall点 即lua_pcall返回。

C库函数的例子
int dir(lua_State *L)
{
    HANDLE              h;
    WIN32_FIND_DATAA    fd;
    const char         *dirpath;
    dirpath = luaL_checkstring(L, 1); /* 一旦出错立刻压入错误,并从lua_pcall返回,luaL_error也一样 */
    if ((h = FindFirstFileA(dirpath, &fd)) == INVALID_HANDLE_VALUE)
        return luaL_error(L, "failed to find '%s', win32 error code %d", dirpath, GetLastError());
    return 0;
}

lua_error在内部调用luaD_throw函数:
void luaD_throw (lua_State *L, int errcode) {
if (L->errorJmp) {
    L->errorJmp->status = errcode;
    LUAI_THROW(L, L->errorJmp);
}
else {
    L->status = cast_byte(errcode);
    if (G(L)->panic) {
      resetstack(L, errcode);
      lua_unlock(L);
      G(L)->panic(L);
    }
    exit(EXIT_FAILURE);
}
}
1. 当一个跳转点存在时,lua_error将做一个长跳转
2. 否则调用一个panic函数(如果存在),并退出宿主程序。

现在的问题是跳转点何时会存在,位于何处?
答案:LUA库函数中运行于保护模式的函数会设置跳转点,这包括lua_pcall, lua_cpcall, 以及由此函数衍生的一系列宏(如lua_dofile, luaL_dostring等)
观察lua_pcall的源码,该函数调用luaD_rawrunprotected
int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
struct lua_longjmp lj;
lj.status = 0;
lj.previous = L->errorJmp; /* chain new error handler */
L->errorJmp = &lj;
LUAI_TRY(L, &lj,
    (*f)(L, ud);
);
L->errorJmp = lj.previous; /* restore old error handler */
return lj.status;
}
这段代码显示了设置跳转点的过程。相比之下无保护的lua_call就没有类似的代码。
1.调用lua_pcall后,如果调用栈上发生任何错误(即lua_error被调用),lua_error将直接跳转至lua_pcall的调用点,并从lua_pcall返回。
2.调用lua_call后发生错误,lua_error将直接调用panic函数并退出宿主程序;除非通过设置自定义panic函数永不返回(通常是做长跳转以避免退出)。

当使用lua_call时,用lua_atpanic为其设置panic函数

为何使用lua_atpanic
当调用无保护的lua_call后,如果调用栈发生错误(lua_error),那么默认行为是直接退出宿主程序。要避免这样的情况,一种方法是定义自己的panic函数,并作为参数调用lua_atpanic;此外为了避免退出宿主程序,自定义的panic函数应该永不返回(通常是做一个长跳转,令其跳转至lua_call调用点,不过这种做法几乎与lua_pcall无异)
1. lua_atpanic设置新panic函数并返回旧的panic函数。
2. 当在无保护环境下发生错误,lua调用当前的panic函数并呼叫exit(EXIT_FAILURE)退出宿主程序。
3. 我们可以提供自己的panic函数以避免退出宿主程序。(一种方法是做一个长跳转(long jump))
4. panic函数可以访问位于栈顶的错误讯息。


示例

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>
#include <setjmp.h>

static jmp_buf jbuf;

int
panichandler(lua_State *L)
{  
    printf("%s\n", lua_tostring(L, 1));
    lua_pop(L, 1);
    longjmp(&jbuf, 1);  
}

int main(int argc, char *argv[])
{
  lua_State *L;
  int ret = 0;

  if ((L = lua_open()) == NULL)
  {
     printf("lua_open() failed!\n");
     return 1;
   }

   luaL_openlibs(L);
   lua_atpanic(L, panichandler);

  if (luaL_loadfile(L, "main.lua") == 0)
   {  
      if (setjmp(&jbuf) == 0)   /* first jmp */
          lua_call(L, 0, 0);    
      else                      /* second jmp, error */
          ret = 1;    
   }
   else
      ret = 1;

  lua_close(L);
  return ret;
}

Quote Of The Day