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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 W$ ~6 ]8 J; m+ k4 n  H$ V
+ ^- J% b2 i/ R9 k6 ^& ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: ?4 g  W- F/ f" T& N4 j( R# D#include <unistd.h>
& H8 }& |) a& u9 k  w#include <sys/mman.h>
5 ~1 y( A! }3 C% r1 ~#include <sys/types.h>
9 `2 Y1 _# G0 i& Y% N' Q5 L6 ^* G0 n#include <fcntl.h>
& j- g9 K6 h( d+ q, ~8 x- y% ]" f( [# t% R# _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* L4 S4 V- X" B
- `% d- l9 F5 w5 H, _0 gtypedef struct
' d: I/ {% \5 q9 e5 h{
5 D' u, a5 u& c+ W* e        unsigned int a;
  Y, t% j$ b9 [4 x$ w        unsigned int b;
3 `$ ~' u4 O* F+ ~        unsigned int packet_cout;1 O+ B, K( b$ F, s# ]1 l) [5 \/ _. v4 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ l1 g0 o3 i6 x+ W# y4 x

/ X1 [& n, Y/ W* X' I8 N& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* w; e) |. s$ s( ]unsigned int count_copy = 0;4 s  z& c! Y! w: T: P7 X$ c
& _$ _. V+ R" D7 J! c
, h& c: s& P$ g1 z0 o& S9 C( M
int main()5 M, q4 s; u6 ^7 ]# g9 d& P1 ]; j3 g
{
: e* a! q( z- M2 S( \        pRX_MSG_PROTOCOL pshreRAM = NULL;
- O1 l, W# z5 X& i' }% q/ {8 Q/ i- ?" r        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! X. y- w  j9 ^

) M6 n+ W% y0 @8 M. Y        while(1)" M! O" `: X$ V8 Y( _4 a1 l3 C
        {
# T8 C+ I# Z1 N+ g5 J+ Q                read_MSG_buffer(pshreRAM);
( ^3 u' b6 K% x4 j        }               
( d8 b- _$ {' E- t}
9 T  P% f, t% n- Q5 I" M3 u$ `( L  ]; O( F0 x0 M" p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 R5 _( {+ G8 X: k
{! P7 I. G: H) i4 z  @- ~8 h5 g
        RX_MSG_PROTOCOL buf;
  C  W8 v2 t: g# T- Z2 Q        
, R6 e* c6 T& u, g        buf.a = pshreRAM->a;- x  I8 o: E6 a* E/ w
        buf.b = pshreRAM->b;
# M  c0 _; v6 G& P5 |# H) Q        buf.packet_cout = pshreRAM->packet_cout;  v4 S0 O' S" b) m+ W% C
        ( w/ O* a: t- Y) L! _1 \) r, ?
        if(buf.packet_cout != count_copy)
! ~8 z+ p3 b$ K: _# ~, |0 Z        {  M& L6 Y( U) t- U. \0 R$ r
                printf("a is %d\n", buf.a);
" G! v  \, m4 [( g4 D  [                printf("b is %d\n", buf.b);0 M0 i3 Z$ q' W! ~
                printf("count is %d\n", buf.packet_cout);& j9 \; U, _3 q: m% n
                count_copy = buf.packet_cout;
! _' B' b8 `( a        }2 x( a4 d" ~8 o' _7 I% O3 V
        else* z# e# ?8 j2 y7 B( p' x
        {
9 }* p! j- d% Z+ a                printf("No effective message!");! [; t- k7 G6 m- s6 u1 n1 z; v* W
        }7 d1 j+ m7 N5 l
}
0 i9 ^8 k2 e% H, `& Y9 A
+ q* A  B8 `5 }+ `; Q
5 }! }7 l% c, U- B1 ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# }& {7 j: V* @2 E
使用下面代码,对内存使用了mmap函数后:: C4 `6 B4 Q1 [' }6 b* H
#include <stdio.h>
6 Q* t/ ^9 `1 T5 G7 H3 B#include <unistd.h>' O3 s: Q; E0 b" c: \" X' f
#include <sys/mman.h>3 g9 ~3 h0 t/ h# Q, l
#include <sys/types.h>6 ?' R+ F- F5 A8 S6 X2 W
#include <fcntl.h>( k5 c# U# w% b" ^0 H8 b
3 P4 u, v& k+ T$ }& U7 H0 i, h
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ c* U  P6 ?- h$ C) K
#define SHAER_RAM_SIZE         (0x20000)   
2 r* L$ s0 {! F) G! [5 A& j: h/ e3 B& I
typedef struct; G- V, H; q; J# G" W1 Z0 Q9 Q
{- b- m1 N& q* S. w
        unsigned int a;
; T' F- H" u/ h1 Z; m! I; A        unsigned int b;
6 X% g3 d# _5 q+ h; b$ J        unsigned int packet_cout;
. L& P0 C  d$ f' ?' u" t! x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 g7 f% m2 l; |
2 v5 ], ~; V. K. ovoid read_MSG_buffer(int *baseaddr);9 D/ o; w- S( D! E3 `5 U
unsigned int count_copy = 0;) e: X3 @: r' w' c" c
& Y" r- e5 T7 F8 g- Z% m
int main()- X3 f1 n, s# O% c0 |
{
. Q- o; y. V( ?1 S# }0 J5 Y        int fd;
4 S" m' B  |/ {$ u, ^: I        int *mem = NULL;% g# k( x% X! {

8 z0 V* r( x8 a0 f% E# e0 H3 S        if((fd = open("/dev/mem", O_RDWR)) <0)
; H/ R& M/ k& {9 V/ X        {
9 C9 @2 Z" i/ o' _$ G                perror("open error");
) ~) r2 Y2 Y3 `, {) g2 U1 C0 v; B* a                return -1;, S. h1 Q8 M+ y8 U8 G
        }: T2 w' c# Y+ q) Q8 |
        
% _7 Q, f* b. `& c        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; Q) V( V: P  o1 Q3 t
) }, e& Y) a/ }6 }
        while(1)9 X4 \2 ]- b# C/ C% u
        {7 O% m! x" v" u7 C. [- R
                read_MSG_buffer(mem);
9 P* N% q0 U8 O# r$ ]" F- m: Q        }               
: Y; T* l, E' M, }}
; B( M! h" k& w: {8 x& e! B
9 Z" l/ G5 @9 D7 d4 hvoid read_MSG_buffer(int *baseaddr)3 `" a) p3 D+ G2 R! }
{
& S5 C8 m+ w3 ?; w& Y/ H        pRX_MSG_PROTOCOL pshreRAM = NULL;3 j: m3 H/ t; y2 d7 r- A& H

1 w7 ?3 V" x" v" w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. G1 h$ I8 T/ M( q  X" P2 I6 u. O  h- P; b1 r! @. u
        if(pshreRAM->packet_cout != count_copy)
+ s. N) Z' Y) v) u        {
' w: g/ m& T- f; x4 T, w- @                printf("a is %d\n", pshreRAM->a);( W0 `. X% ?2 a; W: ?
                printf("b is %d\n", pshreRAM->b);
0 @+ q4 N/ A. N# c, [- R+ u                printf("count is %d\n", pshreRAM->packet_cout);
, d, E3 c7 p* {3 R4 M3 q9 V; S" J$ F                count_copy = pshreRAM->packet_cout;" X# R. L6 g. D% y, e0 y, n
        }
; A  g1 z3 x5 T5 G/ m) m' S        else
3 n# J7 S/ L, Z1 w. p9 q5 r        {$ l. h% p0 \' ~: _
                printf("No effective message!\n");$ T3 i2 K4 q9 E2 ?5 T- Y. |
        }
7 n8 [0 c0 M: u6 e}' h! w& x7 a' D

- ?4 C1 J8 p6 Y) R3 n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! E" }/ w! s8 u

1 E: L# I1 S5 H8 a5 Z  s5 L7 W/ a4 X
; F2 [) a% P5 w; N6 M+ ~( |  H. y, R

9 V) @' D( h+ n' V# `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-18 05:32 , Processed in 0.054483 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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