OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  s& n0 }! H- z# ^. g+ o: ?5 s+ G8 W: e( F4 M# |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 d2 A! r9 j6 {; r3 v0 p" o0 D#include <unistd.h>4 F9 M5 @$ t: Q) f  O3 x6 p4 K
#include <sys/mman.h>
3 }8 U* N1 o. Y# g) l5 A  h#include <sys/types.h>7 P8 O) N3 A* z! R
#include <fcntl.h>
" k" \& L* z  V1 n4 g
! A9 h! U- e+ L1 c; s8 u#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* C2 h6 G" y$ _$ m4 e
5 C  i6 X# K# s  n  X) Ftypedef struct
3 t* T1 Y" N1 \{
: K# W" D' S* c6 h        unsigned int a;' X6 y% |6 ^- ]. {5 k
        unsigned int b;. E' w, z  S3 s- Z
        unsigned int packet_cout;
7 k4 t. E+ L0 z/ H5 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* W  H, G8 w& m! v, p

* C2 R3 e2 L8 u0 |- Q! Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: j3 {2 \# @. P! F0 D& L+ tunsigned int count_copy = 0;1 w$ Y& v9 Y; i' [4 `
) k% F) b$ w6 C* Z* T% F/ N3 o. i

+ k* n; l# j! yint main()
4 N& Y0 v7 q& W: [9 v, s{+ D& F) @2 Q8 _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ K6 Y- H4 @5 H$ W, u, [3 l+ a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 m& r1 I& d1 f) S4 o% b( n1 x# x
        while(1)
7 P6 f- n7 Z0 h1 w4 O' _        {
2 J) u3 ?$ a% h+ w                read_MSG_buffer(pshreRAM);( a8 E7 |3 P( _- r8 A
        }                5 M7 L2 y3 c2 k4 n! l& e9 W# Y
}
1 c5 Y! E. J/ w0 ~3 O0 y) G5 W3 n) G) A3 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); D) v  [6 \- q- j2 e7 X9 {: T
{! ~. O: o  v, i# ~1 k0 h$ ~
        RX_MSG_PROTOCOL buf;
$ B9 O  ?$ f- J" g        
* U3 W# G# x8 y! N- s9 [) S- |        buf.a = pshreRAM->a;
( h0 o0 i) [7 a1 s9 B/ `6 i        buf.b = pshreRAM->b;" g9 b4 p  n: Y' \8 {. s
        buf.packet_cout = pshreRAM->packet_cout;
' c. U/ N6 F3 v! Q        
0 \$ t( @1 T& D8 _        if(buf.packet_cout != count_copy)! o. S: W3 K, a% f  r( c
        {
/ O! e0 k0 T% ~' b- f5 M                printf("a is %d\n", buf.a);
. S( x3 f% K8 V  h" o2 @, {                printf("b is %d\n", buf.b);
& t4 N0 Q7 t1 ]0 C                printf("count is %d\n", buf.packet_cout);
1 p2 S4 d2 t7 q( F' A% U& S                count_copy = buf.packet_cout;
% L& h( [3 `7 a  _        }
1 j/ ?# S- E1 F1 s# E( l        else
9 G, t5 I* x' D2 L: c" }& i' a        {, e, T. O" T5 C$ V
                printf("No effective message!");
7 N2 _; t2 n% D0 ^, O8 c        }
% ?9 C1 B0 v2 r% B3 G3 K/ g}
# y/ K" [" Q. [
/ L: r( I5 r# p
; K" V- Z3 m( S9 T  y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 T6 E! m* e5 O& J2 J0 o# y2 P- S1 p使用下面代码,对内存使用了mmap函数后:' n3 f! `+ ]; Q; k: V' A
#include <stdio.h>% d7 F* j4 J  |% ?
#include <unistd.h>
6 ~# u* `% o- l9 p9 s% E% F- d9 s3 R#include <sys/mman.h>, l: ]* m9 f& r1 E, Q
#include <sys/types.h>
, i8 S+ c5 T' K#include <fcntl.h>
$ e! z$ u) n$ R. P, e1 \9 ^
1 g  Q& q3 ]  E, \#define SHAER_RAM_BASE_ADDR    (0x80000000)
& H, |5 }' m+ o) X#define SHAER_RAM_SIZE         (0x20000)   / y' M& k  a' d3 b8 n# {
6 _6 h" W" h4 Q- X2 a
typedef struct
, Z* x; Q# u- `: j6 P- w{$ z8 Z0 y  d. o+ U/ S/ |
        unsigned int a;% m4 Y6 f! f5 ~: F# ~
        unsigned int b;: M0 j4 p. ~1 Z) h: V8 ?3 D6 _$ `
        unsigned int packet_cout;
# E, w( a4 W0 r0 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( x) |6 a; F0 y- T. b. Y
0 Y. |3 e* _, K
void read_MSG_buffer(int *baseaddr);
4 C1 E$ ^* i  [8 W/ l0 P7 i4 o* Z. {unsigned int count_copy = 0;2 K0 l. K6 W  t

' F6 }. c: h2 E# x7 qint main()
( v: D8 X0 d- ]{
: B% r0 G8 s8 L4 |        int fd;
( y0 G0 n/ S7 K        int *mem = NULL;% q6 C% ^) Z1 Q+ [

- V- y& s/ w& M/ K* x2 T6 g        if((fd = open("/dev/mem", O_RDWR)) <0)
8 r+ Q' |+ K+ x" X( o( x2 Q/ {+ S        {
  J2 G0 }( c& T' L" A( P                perror("open error");
& f% U# x5 x2 G- C. ~% z' x                return -1;- |4 P9 @! Y% H! w
        }5 l. e, R2 t* F. g# K6 @
        5 Y9 g  U% W( Y/ C4 d$ g
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 v' z$ z( g9 L. w2 q: H) Y: G2 b8 T0 D) A* _$ u% i9 L' Q
        while(1)
) r2 |" n6 o6 g6 V9 Q$ F        {
  n+ `* e" H/ Q* X6 `                read_MSG_buffer(mem);
: i+ `7 u* J& p0 K4 z        }               
! ~$ ^& ?1 R  f}( L' [3 i5 K, x
* T5 m1 x& H; ~( s
void read_MSG_buffer(int *baseaddr)
# n! a8 b" m+ l( H' l4 y3 D{) g) y% ?& i2 X3 _! u( E* F
        pRX_MSG_PROTOCOL pshreRAM = NULL;- a# w/ F) L& q; }5 d" M
0 ?. {: D% b9 `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 M- {8 X" B1 H/ u# k! `7 z2 l0 U
( `; R  g9 u3 D6 q, b( u        if(pshreRAM->packet_cout != count_copy)
3 D- ]5 p+ B4 d2 t1 Z; f/ b4 y. S1 e        {8 y  q( }, P  U: Y; r# f) N
                printf("a is %d\n", pshreRAM->a);
- V9 D/ S0 S1 a3 I' F6 o, N% h                printf("b is %d\n", pshreRAM->b);5 [4 v# P/ ^1 p, b! t$ ?
                printf("count is %d\n", pshreRAM->packet_cout);3 H  M( g( W1 U* H
                count_copy = pshreRAM->packet_cout;( ?! a/ M% [* t* ^
        }
" X. K  i. v8 J) a, Z! Y        else
/ \6 M# @0 F/ b$ b        {# x) l, Q7 l; S. w  t
                printf("No effective message!\n");
+ t3 l* C: g" ~7 o- E/ E& E        }5 V$ g& L. T" ?4 f6 H9 t
}
; B# @( q3 `1 d8 @7 O; S& H1 k1 n$ P. Q+ E; T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' H, ^) d2 v2 E+ @$ O3 s5 c/ N; b/ M- Q$ o5 T$ c
1 S2 S2 Q( _$ ^6 R" k( o1 z! V

  {; I% j) [1 {8 U! J9 }6 `  a/ h3 b) O0 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 15:19 , Processed in 0.040558 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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