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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( L& s: G2 ?  r/ J; E
* c' Z7 {1 v2 V- R( ]+ w3 lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. n* L" i- A1 Y% R! g5 |& L
#include <unistd.h>
6 v8 ^* E) N4 r4 T" b$ G& D6 L  U#include <sys/mman.h>
) D7 i8 f/ e# b8 H. N: b#include <sys/types.h>
1 P; i+ o# g4 s#include <fcntl.h>
( t# C9 g; {6 A7 A2 \1 {& ?
* z  v2 D, p: ?, }3 v+ b1 g#define SHAER_RAM_BASE_ADDR    (0x80000000)   # T1 Z. n* S) r! h
2 g" h+ i) P* T- M1 e
typedef struct
9 r( I! d/ {3 l6 w4 p2 S{
* ?8 O, ]' U/ @. P, T        unsigned int a;
5 e  g/ P+ X: I2 R        unsigned int b;) |- u7 z0 n0 C
        unsigned int packet_cout;3 p6 ]7 m4 {0 I& l8 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 J8 ?( t" r, ^* s
( i5 c* i) J: b- m7 a! j# r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 I; y- Z& e& F3 B6 x: Cunsigned int count_copy = 0;
6 |" o4 E1 k; ]6 s# z$ S3 i3 b- u! Q5 C3 K

- h! j$ b7 G; J7 G9 n0 Uint main()
6 d) }8 b7 o! O0 h% j{3 p8 I$ s( O( J( y  C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 D) u  @5 ^' j. s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* O5 B7 O/ L0 {. Q" F! c

" V- G3 j7 i6 t% ?: o        while(1)0 }0 n+ _6 d2 x+ l0 v- L
        {* Y0 j! H: o8 W! M  q' X
                read_MSG_buffer(pshreRAM);5 Z# \" \5 Z" Q' V! B
        }                $ [" T0 P2 k% K' F5 H
}9 ]. R) ?' i8 Z% B$ k* w

7 O# B4 C& }" W& rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% W& D' R; s+ H9 k
{
6 N0 ]) {5 k  ]+ Q$ c6 y, V- X/ }        RX_MSG_PROTOCOL buf;( U1 b$ T! @! F& a
        7 M* Z, e$ L: r( H4 y
        buf.a = pshreRAM->a;
5 y: ~' @6 N, R# k7 S2 b        buf.b = pshreRAM->b;
$ Y/ B' E  `; H        buf.packet_cout = pshreRAM->packet_cout;  }7 s& r& O$ U' J& q, Z1 f1 c
        + l0 F2 q, y8 `3 m9 W( b' b1 b" u
        if(buf.packet_cout != count_copy)
9 Y3 c  H( I5 B6 ]9 ^        {
0 b5 @6 V9 J5 @" S+ V# R. k                printf("a is %d\n", buf.a);% a& @$ x. d2 p  p: w
                printf("b is %d\n", buf.b);, R- R+ R5 v7 U+ H' J9 n" [
                printf("count is %d\n", buf.packet_cout);! [: a& f9 K' F: a) Y$ d
                count_copy = buf.packet_cout;# |( e: C7 }7 |" N2 T0 @
        }* D0 G  K4 I! d4 e( M% i4 i
        else! }+ |- M3 \. s5 l$ u! T: x
        {
3 p3 k6 _6 A% o$ d+ v                printf("No effective message!");
$ T( a8 `/ d6 s; O        }
- e  j; v. X+ r) K, M* x}
6 Y8 u+ @9 E5 V9 ?* |+ f# P9 Q0 H
. `; k2 @# F, s( V+ `# d8 N/ M/ f4 K& h9 f1 U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( [( T3 |# ?% @: J6 z( F4 W/ _使用下面代码,对内存使用了mmap函数后:! u6 J; t) ]1 S* V# X! N, w" y/ |
#include <stdio.h>; ^5 e2 u3 t& {# s7 K. }/ `' s
#include <unistd.h>6 P2 L$ F, e3 B0 M2 f' T
#include <sys/mman.h>; U' o- b2 l* e% l
#include <sys/types.h>
4 s4 }4 C+ l6 z2 k- v2 r#include <fcntl.h>, @- x% w) N4 E$ R' M$ \2 C* L3 E% D1 G
7 k# @3 _0 c9 H" w) u4 K
#define SHAER_RAM_BASE_ADDR    (0x80000000)$ x9 R0 T" p: \% a( M
#define SHAER_RAM_SIZE         (0x20000)   1 h  G# _0 u4 Y6 R5 i
* r# y  r! N1 I8 Z8 t. M) t
typedef struct' a8 T" |" Z) f! w& u5 H: z
{8 M& d6 ?, {- b. m" n9 h
        unsigned int a;
% B9 m# i- ~- a: s' m* w% f        unsigned int b;  R( j' |# u& ~) Z  ]
        unsigned int packet_cout;! T& }) A/ T" w+ j* t( c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" [1 T9 E& k' z7 v( o  \. p
2 q/ B, m  ]) S: d& O( j8 w
void read_MSG_buffer(int *baseaddr);
6 ^) k- w! X" i; j  {unsigned int count_copy = 0;
7 j: ?1 c7 I! u8 z. |% L0 ^. t6 Z% O' X1 B% a! Z9 T
int main()
5 B1 N6 }- W$ v5 s" n8 m{8 Y7 C, w: ?8 t  e8 w& y" [2 B
        int fd;
$ c( u7 P1 `  J8 ^$ f1 q        int *mem = NULL;
' i! w+ m* T; ^& n4 T
5 L7 F  @/ u# O$ e        if((fd = open("/dev/mem", O_RDWR)) <0)  I9 M% c+ f) b, G: _" U8 Q7 J3 {& n
        {6 {/ M3 \4 M$ `  Q0 h
                perror("open error");
6 I# s: I  o( X* V                return -1;
1 I& F. X! l6 Z$ B4 T" Q        }  i- }: u3 N/ X4 A
        ; H' B) F. L7 n' j6 Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; v2 R0 A# t) ?  P& n4 Q% l
9 g6 L0 d7 z. d! F0 n2 j7 Z
        while(1)! g8 @: g% ]; D4 w- ?4 a' S
        {5 ~! c& q3 R) v1 L2 ]& ]/ P
                read_MSG_buffer(mem);5 Z7 M" @& e  y* O, z- l' E, B
        }               
: o) I: X9 z2 l2 C2 M8 p}
* c0 O/ D- H: j, k2 N) M3 E
* l) m4 s" ?6 Y* j6 Z* n5 ovoid read_MSG_buffer(int *baseaddr)
3 f$ L* g( |; U, {8 `/ h5 F{
1 J7 u2 e6 D5 _4 [        pRX_MSG_PROTOCOL pshreRAM = NULL;. o. Z) D3 x% Z8 E% R2 `4 R

5 d7 O* j% t4 P7 T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ ?. A$ z3 V6 X/ s3 T# b3 W4 |5 h
! @- Y  X: @* ]% n7 ]! m        if(pshreRAM->packet_cout != count_copy)
6 W- n& U* b) ?        {+ R5 |; U  |# N  T
                printf("a is %d\n", pshreRAM->a);
9 N- H7 k- M3 `                printf("b is %d\n", pshreRAM->b);! R$ _( [8 }2 {+ Z* |
                printf("count is %d\n", pshreRAM->packet_cout);6 x9 a; z1 A+ w, k- Z* {* n, H) }
                count_copy = pshreRAM->packet_cout;" n4 ^% s( J# ~) Q$ ^
        }
* i& Q! u0 F3 F* Q+ B: V3 l: E        else. {; u) J- ^7 c3 m" }& G
        {
2 [5 ?1 F9 r! Z+ F& t, L8 D                printf("No effective message!\n");7 @3 T6 e8 z: V3 n. `
        }
2 V5 X) L2 G* u! {  I, F8 l}
2 {! R4 o' x8 K* n. X  P+ l1 v3 e& S  U0 {' D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. m) I6 s& C( B

" g6 [- ?; c9 \- K  |0 H) ]& S' ~+ q* F! e

  |& L2 {- F) l8 ]# n- [! V6 ^7 c& H8 R  z1 q' H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 04:52 , Processed in 0.040050 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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