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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / G) R$ f- }) H& d% z+ T, x! ?- N7 F
# `* Z5 M; P5 r1 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 Q$ U/ @1 U! Q% _2 P9 h
#include <unistd.h>0 k) S2 M( [4 `8 T7 U
#include <sys/mman.h>
4 g  [4 {! F6 H+ K#include <sys/types.h>1 t2 G. t* s+ w8 ]: C- i5 a
#include <fcntl.h>
* s$ V. C3 A* w9 [3 H' B5 F7 J
/ I& N4 W; K' c# I" u+ X+ u#define SHAER_RAM_BASE_ADDR    (0x80000000)   : P; \1 Z% L# _, j& y' }3 n

: E+ K& |8 U( W" p! i7 ?3 K/ _2 itypedef struct
- `0 ?4 v. H7 I{! F+ r( Z8 U/ x( c! D: j3 c4 P
        unsigned int a;
& g5 \8 |1 d# C& A* J) o        unsigned int b;
* U9 R9 M9 J6 n, i1 M4 G7 i        unsigned int packet_cout;
# Z+ U$ g: l  p& M; }+ x$ }. l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 M- L  Y/ Q/ `5 z$ _0 T, h7 R2 z$ J3 ]4 S8 p3 @0 X' m6 }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 I# q7 t; m; K& }unsigned int count_copy = 0;4 V- i  Q2 f2 B( X# Z1 \

+ p& S. S7 o& H. |* m( u
7 W- a7 k4 K, y( Dint main()
  K& v6 h9 f: K( H{( A  u4 Q3 n5 Y2 f, F6 Z1 r
        pRX_MSG_PROTOCOL pshreRAM = NULL;. A- U4 K5 Y7 }5 _7 V. B8 x0 m$ h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; V6 w+ `5 l* t$ r8 l. u
; f+ U9 t; _2 r" k2 Z& a" k' S0 t% K
        while(1)5 p/ l4 d$ c+ X9 F
        {3 r$ J7 P% e. u7 c$ ^
                read_MSG_buffer(pshreRAM);
" m% J; P: _2 k9 W+ O        }               
% q' r4 L1 f8 z5 G7 x- E. T}
1 H( H) q6 `7 l; M% W/ S; u+ p' q! ?/ ^' }1 o( |7 W7 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ ?$ m" m" m' {
{
# g% @5 D/ m: K/ U5 h: D1 D        RX_MSG_PROTOCOL buf;
2 E) ^, y4 @5 e  P! @# z        
# w* R6 s& X  o        buf.a = pshreRAM->a;
$ `1 }/ |. c! @1 \! W& q9 O; b        buf.b = pshreRAM->b;  U8 y; J+ P8 y
        buf.packet_cout = pshreRAM->packet_cout;
  O% u: J$ \+ P        2 o* E! k. Z/ ^9 V$ y  t" D
        if(buf.packet_cout != count_copy)
+ \- p7 n2 {  S# {% I4 J2 q1 v        {9 U/ t/ L8 v' M, t
                printf("a is %d\n", buf.a);
. u$ D; M. W* n" e( f                printf("b is %d\n", buf.b);
* I  A( S  Z5 X; q; H1 B: f( ?                printf("count is %d\n", buf.packet_cout);
4 x( s* l$ P$ W; L) a                count_copy = buf.packet_cout;
6 P+ M, R6 r/ S        }
( b0 v& W; W2 T1 a0 b. t! R1 k        else
7 s; b% o1 M0 i. ?* v1 C( q! b        {6 \% z9 |6 u. w1 L( Y* B/ l4 ~
                printf("No effective message!");) j" n1 `, U' K* e4 J+ ~
        }
3 u& [& C. w: J2 b% \5 S2 t}
+ P" P0 k2 S+ Y* m6 k( a& a& v9 [( T% t
' a7 z3 D* ?& L" F7 d' G8 i  H# W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& X, y: ]+ Y- i9 n; C& o: d& S" E& D使用下面代码,对内存使用了mmap函数后:
! [, E- E2 E8 x' ]7 ?1 L#include <stdio.h>1 `. m' J: b% K" ?4 v* m( [+ a
#include <unistd.h>
( q/ b' L# x6 B6 u#include <sys/mman.h>
' D5 v  u* x* f. [$ g4 k% x' x#include <sys/types.h>
- Z; ]1 h& O6 ?$ ^4 p#include <fcntl.h>
, q9 V  {$ J1 ~0 Z% j( P6 w
6 r  z9 _" C& n! N/ c1 x- A#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 j( A, y4 O+ x. z% x% G8 o#define SHAER_RAM_SIZE         (0x20000)   
+ b2 f$ s) P+ G9 ]5 a' H$ ?2 d
9 g8 q6 ~) t% v" ^6 |* C; Ztypedef struct
. _  ?% z; X( i9 N0 h+ G# C* u{9 j  x4 F; Q% d/ [2 Y
        unsigned int a;
, ^3 H7 G. L: N: i6 m  t        unsigned int b;
9 k/ X, u6 J& l" v3 l0 i        unsigned int packet_cout;* u, B. l6 d9 C9 f& H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" Z, L- q% m1 V+ f/ [
* L5 m6 w, l; g0 a4 h- h  j- s
void read_MSG_buffer(int *baseaddr);* k0 n. t* K! i
unsigned int count_copy = 0;
( g& f  E) h! v$ n3 D( ^* }5 M: B8 R+ p7 }+ j" ~7 h; f
int main()
7 i/ W7 [3 q( C) |9 @{: w  D2 A7 k/ F' N  n
        int fd;
. W' _! R' ?  a6 t2 T        int *mem = NULL;
0 T% K0 M4 U6 P
2 Y4 S4 Q! U5 e  u: w' B        if((fd = open("/dev/mem", O_RDWR)) <0)
  a3 h) _* ^0 z. Y( {! n/ K: _        {
* J: @) M( J* b! T' p( X                perror("open error");
, [& I. d6 t/ r( b& Q) m                return -1;7 C3 @2 g) `! j- m9 ]! F7 w
        }
/ D5 `# H, q" J" \2 u        
) I! d5 G* l/ |( y4 F( c        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 F. ?; o1 `2 t8 ]
$ D4 @3 |. _8 x  q3 Q# L8 S( L
        while(1)
3 ~# b$ M" F& ^* I. r: }6 ], _        {: M' X0 ]0 i2 x, s8 @1 ?# Z/ m  ]6 j
                read_MSG_buffer(mem);# E/ B3 F2 I& @6 w( R+ s; f
        }                " b2 U! _2 i' s9 U6 w& B4 L7 e. W
}9 R$ Z+ R" ]1 @+ w

6 N- f) _3 Q1 J' H2 t! kvoid read_MSG_buffer(int *baseaddr)
  T+ A0 p2 q# D{
. [" H) S9 r/ P' Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ j% Y) [3 e, e% H2 O6 W8 A2 L1 S# h. B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' @: _+ e0 }' x3 N; M8 Y

9 n* x9 E" v( x1 X        if(pshreRAM->packet_cout != count_copy)5 Z3 i% F' N- o4 A+ F2 D: F) ]5 B& l
        {
' a: [" m( |* F& f! u                printf("a is %d\n", pshreRAM->a);  h5 a1 i6 P; |6 D% ]( H
                printf("b is %d\n", pshreRAM->b);
8 E  r2 K; n$ h" A3 k8 y3 o                printf("count is %d\n", pshreRAM->packet_cout);
5 H' w# L7 O/ _, S  G                count_copy = pshreRAM->packet_cout;
- U; _) |: r. @! Z( o  v        }
# U, }2 L/ y4 k- v, Z        else" y8 z& }1 f+ w% |7 n; {1 v
        {, i! S1 V$ Q  u$ x, {2 t
                printf("No effective message!\n");) B' p+ h; B' ?; [4 u
        }
  A" y* Q7 R8 c3 j}
( n  V/ F. M  ?6 d" v7 L
7 R( X" y  X! P$ [. K0 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. m( t. r- e1 l; y
& B  B. N+ ~" ?/ d' w0 `5 ~: T! D

& V5 x" v, V. ?1 X& o. j
5 Y& f) Z1 Q$ m: k$ `. J1 s+ D2 y/ i: ?6 {: i! }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-5 15:31 , Processed in 0.038837 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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