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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ T% n& P5 o- K- x4 O7 d) R0 k) u0 E" w9 w4 Y* w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 ^4 i) Q. h% |! L
#include <unistd.h>
8 F2 j+ x, w9 N2 I#include <sys/mman.h>
1 Z: a' w$ b% s! R2 D#include <sys/types.h>( E% A& o7 E7 q( X0 I5 d% A" W
#include <fcntl.h>
* T5 n- ^1 b2 g, T. d7 J5 C# D4 M4 {' I$ S  o( L2 `7 S# M
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# b% |. ^7 w9 e; g$ X( k/ f& g! _4 c5 F9 N9 ^9 J3 _: \% C
typedef struct
8 ^; T9 T2 h7 w9 T1 G{3 E" d! \' m3 a
        unsigned int a;* e( q2 s( X' F4 Z# z* w
        unsigned int b;
4 h0 G+ G. `/ S1 a/ b* J; D4 g' v        unsigned int packet_cout;0 F( f- R* A' h6 A+ H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. L0 r/ a2 Q% u: O
! s2 J) S+ s2 E7 b6 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 c9 ]8 z! g9 ^3 i
unsigned int count_copy = 0;+ G& k% n% z0 ]) A0 ]5 {& a

0 F& o; T" n7 B
' F- r' M$ o! `9 kint main(), W# C5 R! P- v
{0 A, g; k  F9 ^. c
        pRX_MSG_PROTOCOL pshreRAM = NULL;  X5 {2 m* ~' e# \4 `+ P0 b$ z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) p& Y" [9 e2 U! t% O2 i! ]! E4 j

5 f: ?$ M, }! o% f4 w& l        while(1)
- P) G# S0 C9 A* O3 d6 w        {8 z; B; r, L7 k- |6 B7 R- S, [' n# Y- v
                read_MSG_buffer(pshreRAM);
6 p& V( W5 W7 d1 c        }                8 J" p8 ^6 F; C
}
7 M" l: H  _6 c) j* i- L% s
7 q% [* n1 `( a* L, ~. n% Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* ]. [3 r- L% r
{$ i! i2 e; {1 {1 t  V
        RX_MSG_PROTOCOL buf;
  h5 q6 t2 X9 V  g$ ^4 [        
' P4 P* x5 R4 A8 R1 V* \        buf.a = pshreRAM->a;
# b3 ~8 D+ H  S        buf.b = pshreRAM->b;
. z& k3 F" r5 t        buf.packet_cout = pshreRAM->packet_cout;
9 z9 V& S$ X6 z        ( [4 `4 K& R& i8 T8 M+ {/ h
        if(buf.packet_cout != count_copy). j3 E' T& i% N* v8 f
        {
* i; }1 r6 _. k. ^( M                printf("a is %d\n", buf.a);
" ^- ]% O$ i: V# `- @: x% h                printf("b is %d\n", buf.b);
0 l/ J) B9 ^& U" D) J% q                printf("count is %d\n", buf.packet_cout);% I: V6 H7 }  J" Z( f  S9 q, v
                count_copy = buf.packet_cout;
" Q4 w$ V" K& N% S' G( S7 I8 m, ~$ _        }
" @0 Y7 H: V" M        else9 Y2 H! r5 B5 g! @( a' `9 V4 Q
        {
! J5 g6 e: j* [+ d3 G                printf("No effective message!");! E, g# I3 V$ b" N% v
        }
( C/ N" N( F8 I2 K}
/ Z( j6 s3 N8 a0 h% M
( }) B  S& ^5 f8 I. [$ U1 E4 j2 e7 O& I2 k& h7 ^- E( B  T+ ]3 H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 R9 H" z+ j% `, t. i- ?% c
使用下面代码,对内存使用了mmap函数后:; n, X  l5 s9 E2 r( z
#include <stdio.h>
7 v* A5 q4 Q4 h, z& ?#include <unistd.h>
* N& H; \) ~) l: t. k#include <sys/mman.h>1 N0 S  x+ l% A9 X8 ~, t3 E' R
#include <sys/types.h>
5 O2 P. ^. n4 \; w$ {. O#include <fcntl.h>- z8 U5 x$ E! q$ \% w

5 u5 _; C9 k0 w1 p, u#define SHAER_RAM_BASE_ADDR    (0x80000000)* i& f& c- m5 L/ ~' o* u
#define SHAER_RAM_SIZE         (0x20000)   
" j( b! u* W. s( Z3 i: ~, J% X5 c: _: K% H
typedef struct
8 p; M9 S0 g9 m4 T: s{
0 F. D# p" n+ ?0 o        unsigned int a;+ g. x0 D+ d2 @
        unsigned int b;2 ?; e* W" L/ \# ?. N
        unsigned int packet_cout;
) d: V/ m! B0 d# b7 E* V4 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( ^7 h0 M5 I. i/ D' Y- s
7 `/ S% ~4 o8 K& R/ ?( Q
void read_MSG_buffer(int *baseaddr);7 m# e0 v) n9 Y( _2 d
unsigned int count_copy = 0;, U  Q' }* w2 w' `. A
4 {; \* P" T" \& I: E
int main()
" G, O& ]1 C& b2 n{. C% s# `6 G$ t2 F
        int fd;5 e& D6 z' \3 @9 u7 l$ t4 Y& A' q
        int *mem = NULL;
9 x: q4 \3 y! x$ v/ l7 ^6 ]* p1 v& I! d) {4 ]8 e/ t
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ z: Y6 l7 L9 \( n; g        {: e- Y& ~5 c0 X# k. X; ~8 J" L2 }
                perror("open error");
# d, O8 D2 N+ U7 e. @& S/ j                return -1;9 k! p& s" f) q6 e
        }' r- N$ @( K$ |  h' v6 q
        . d% d+ ~. _2 v
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% |, R3 {% y' y: c3 l, v5 \( r9 [* H! Q( A% d8 I% W+ ~, S
        while(1)5 S- X2 \" g8 ]1 ~4 U% F' ~8 X$ D! L' c
        {
0 {/ ^: ^- f5 p+ l  G" ^                read_MSG_buffer(mem);: ?; {$ `) \0 c: l# U) X
        }               
& o- q6 m  l2 g- ^7 Q}, q. M  \# n" c3 c4 t9 w2 Y

6 ~* e2 ^( H3 ?! h8 C& bvoid read_MSG_buffer(int *baseaddr)
9 L% D0 J6 z  ~8 r3 E+ ]7 n{, a. }, ~4 |0 D( N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 t  k' u& A' @$ A9 E2 j3 Q0 `1 s3 U
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" G' E& H! z0 \
& H5 A' q1 B# K6 t% @  u5 L
        if(pshreRAM->packet_cout != count_copy)* e5 q4 J( G7 g) p
        {
$ h7 P$ _* z% X3 Z1 r                printf("a is %d\n", pshreRAM->a);
. \9 `& I( P' d' g1 W1 W1 O7 T0 t                printf("b is %d\n", pshreRAM->b);% `6 o* i9 B6 h% ]! L# S
                printf("count is %d\n", pshreRAM->packet_cout);( }0 ?. s$ z4 g9 n( X
                count_copy = pshreRAM->packet_cout;
3 j/ R" F' F6 z        }6 ^, S" l/ P7 ?! ^
        else
' J7 _& B- I! {* }# I        {6 L& b: m# w' u0 _2 v# }% d
                printf("No effective message!\n");
% Q, q  \9 ]4 x        }
; h8 @9 O5 R( P2 t}
0 l- F6 C. C, P; x! Z
3 L( J, y/ g% Z8 L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: W+ V5 R4 \) Q& l, B$ @

7 j! v) K; Z, |6 J3 [6 b. d0 \" _. p; s' c2 C

9 n9 t+ L0 F: e6 r* p9 E0 a+ h2 u1 m3 N4 W- F, h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 16:21 , Processed in 0.041959 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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