OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5934|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 j4 O7 l2 @* e
1 z" l. f' u! F5 `8 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' I' M, l. f: e% Z7 R
#include <unistd.h>
% q( E% C0 y& H- [. U* i#include <sys/mman.h>
! ~- p8 v5 Q. k6 |( m1 z3 Q/ N- r#include <sys/types.h>/ }) [- ?! `3 ^9 y9 @8 d3 l
#include <fcntl.h>
* ?5 C& i2 P2 v+ p- i6 x. B! @  d+ ]1 J7 i, P1 P) l
#define SHAER_RAM_BASE_ADDR    (0x80000000)     M, u0 R8 D, n! |

& l+ [, V2 T4 i! U* A$ d9 ltypedef struct$ H6 L: x- G/ x; q" X0 \
{
, [3 n, P# Z) U1 x# s' h        unsigned int a;
3 w: ^4 s: F, j4 D9 k6 Q0 h        unsigned int b;; e) ^+ b8 V# X& V% I+ t" f7 I/ b
        unsigned int packet_cout;
# H1 O9 G1 ~  }6 Z1 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& A9 |7 r% Q( k+ u4 H( D1 V# j
5 M  ]6 v: m) ]( K- h8 t  Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! D2 c' O) h/ z+ h: c6 tunsigned int count_copy = 0;
* t2 w* I' W. ]* f4 @4 |+ |! t7 f4 ?% ^

" u: C5 _' i- f& P$ @9 Fint main(): A# v; F2 r: h; k8 a8 q
{
9 ]4 z$ _! r2 e4 Y$ l& Q" p        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 B3 C9 h6 x0 i# y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  d1 v' Z" r, A
5 r9 t: U$ d  u
        while(1)
& E, r/ V' s; M: I1 F  Q4 s        {
4 o: U6 ~. {6 c                read_MSG_buffer(pshreRAM);
* v$ S8 C6 q6 _; O8 Q( ^        }                - P* l4 X, \' y6 o5 m( u
}
- v3 [+ |9 y; M  F8 d
9 [3 t' Q! n# pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  F+ g0 X7 e7 f1 n{, Y2 U6 E- z+ d6 r
        RX_MSG_PROTOCOL buf;
/ ~5 B; m% O9 U8 v3 h        9 g8 ~0 b: J* w# G
        buf.a = pshreRAM->a;" x, V' Z1 E  y- j+ v! Y  }  g& c& W
        buf.b = pshreRAM->b;
. ~" u* t8 }  x1 S! F. a/ ~0 ~        buf.packet_cout = pshreRAM->packet_cout;! g5 T  j) {5 V( F: @9 ~
        8 v6 v( |2 w1 R' d8 f" v% T
        if(buf.packet_cout != count_copy)! ?; ~. u& b8 c
        {
6 T- C; O* A2 j/ k" o7 q0 G                printf("a is %d\n", buf.a);% X2 R3 a1 C( ]0 r
                printf("b is %d\n", buf.b);; ~6 e2 i3 T% p9 x
                printf("count is %d\n", buf.packet_cout);
3 m% g( B: h! T! b% a                count_copy = buf.packet_cout;
; G! |& l; W* t7 x% I* b3 @; n        }6 _& ^  T3 e& h0 E
        else! j, g! p; Q' f& Q; Q
        {
; ]: q* M- ~) k) Z  Y& ?! v                printf("No effective message!");' K+ j3 e5 `' t0 I' z8 w% s0 Z3 u
        }
1 r1 s5 f9 P7 F0 _5 i8 T}
. L/ b4 @  {% v- j4 {3 n: W  b8 F1 r' A6 K. _& `
" k0 v- Y8 ]7 K; [6 d. T& E1 X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 o$ ?$ G- |* |1 X. P- r使用下面代码,对内存使用了mmap函数后:
; X  r8 P/ _: ?) O$ C1 F6 c6 b#include <stdio.h>
7 @. a+ x3 e+ R1 x- Q. M. g; m3 p#include <unistd.h>; p7 h4 r( X1 K- q# o$ M' i
#include <sys/mman.h>+ i0 X3 F; K! w4 [  i# \
#include <sys/types.h>. a, A* Z" y/ w
#include <fcntl.h># ~  s3 Y  o$ \1 m6 b. v
9 y8 n5 T6 ?6 ~& R6 r, j% }; a
#define SHAER_RAM_BASE_ADDR    (0x80000000)) [+ p" \& n' R8 l$ c  o
#define SHAER_RAM_SIZE         (0x20000)   3 S; w: g" l: {4 P7 K  z

# u; Q1 l  y* M1 v4 H6 }typedef struct
8 ]2 d5 E2 `( c/ N. W2 M7 D1 r{2 K4 g  N- Y4 w; l
        unsigned int a;
  w% T9 j. [; z/ _8 M7 u        unsigned int b;
2 K& |  T3 ^/ P2 O: H        unsigned int packet_cout;, Y& ^- W/ p7 y4 \1 ?0 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ]" G3 l$ O, l6 B& z2 S, a( u; p, I6 c2 ]9 G& X2 E
void read_MSG_buffer(int *baseaddr);
  `1 Z9 r& ~6 k4 o* _* Zunsigned int count_copy = 0;3 ?; k" B% E* m% b7 @; I
- `& u0 }3 `1 U- l" }& e
int main()
5 X! J3 M, O: Q, O+ |' ~3 q{' m7 l- n) g& c5 T6 s5 r! Y6 d
        int fd;
' P6 \  ~- @! f5 y        int *mem = NULL;
" o; h3 f6 c  U& H, z. O( O9 y% W4 k, `2 j
        if((fd = open("/dev/mem", O_RDWR)) <0)
: O& a' S) \% k8 z        {4 _( [- G. @4 N/ A4 B3 E; Y
                perror("open error");7 |6 G8 A  M0 e
                return -1;. l( \) B. `/ N7 Y# Z$ d+ @
        }
: V% W, A. K# y- |9 `        , r4 ]/ p9 H6 P4 g# O
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; I4 |  A. \1 M* o( U' y1 @6 i
9 V8 j6 _4 q# I/ p        while(1)
% x4 `7 G! `: Z0 H" a- Z        {
1 U* e+ J) N6 t1 F" {                read_MSG_buffer(mem);' q: h/ J" V) N7 e6 O
        }               
8 S" S5 r* I) ~6 P}
2 j  p2 m- ?) e3 ?- N5 H3 F4 ^7 o0 }
void read_MSG_buffer(int *baseaddr)
9 V; k5 v/ v  T  s: E  H{
6 S& |% r! c4 ~+ J6 }2 g* B! `        pRX_MSG_PROTOCOL pshreRAM = NULL;
, G+ b% G0 p- E6 H$ \/ F/ U9 l  P+ O7 N0 d" o, v
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% B8 Q/ `# g" q7 r( [% ?
: o/ W" ^0 U5 ]/ b5 y9 a, q        if(pshreRAM->packet_cout != count_copy)
! ^+ x; S; W: D        {
1 f' H0 m! S, p6 X( J; q6 u" v% _                printf("a is %d\n", pshreRAM->a);
  D0 B$ F4 l- `/ x5 ^3 f                printf("b is %d\n", pshreRAM->b);
! }- ~, j6 ]! s, X! S: l                printf("count is %d\n", pshreRAM->packet_cout);
  Y; ]: C# U( H4 {+ W" `9 P6 p6 `7 g                count_copy = pshreRAM->packet_cout;( G% z, l4 e! G6 k$ r+ ~# c  b2 A
        }
4 f+ @% Z8 y; t' l9 g, g( L        else% n9 Y+ F0 X( d( I$ ?0 @
        {
5 q& l0 X% N* U                printf("No effective message!\n");
- E7 f( N& u9 F* R8 X$ l6 b/ l7 @        }
5 |/ k. \4 S) u5 S. O5 Y}
7 d' o7 H$ X8 |2 i' U' w1 V0 c
* d7 q; o; y/ y1 i- A4 V1 v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% O" R  L% Y6 g# g. B3 j2 d3 l' M; m5 T6 N8 q2 n: r; K

% s: h4 }2 L' [5 m) L6 b" {
' A" X) {+ W' A9 X, e3 e: h4 a, s0 J9 E4 A9 U; x+ q) a: d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-16 11:49 , Processed in 0.052730 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表