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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) J  U6 _) l4 h5 m; B: p) t8 \
+ t2 j: p0 d# D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 T+ p5 b1 ~; j4 v' Q
#include <unistd.h>, @- E( o# ~/ [1 n1 H
#include <sys/mman.h>1 |, K; v, E! W4 n4 k9 n- E
#include <sys/types.h>2 j' z3 d8 n: b! p
#include <fcntl.h>' S( a$ N6 r6 `
8 B1 V6 j7 A: `/ _& b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 o! Y+ M3 b) ~5 x# p3 ~5 p

! K) z0 {! Y. a4 D4 u4 Wtypedef struct
( j% E# g, l: H{
, v, s! S1 x' J7 l! N$ c7 _        unsigned int a;
& |& K9 U  V3 I0 _5 L7 N# a; R        unsigned int b;; O/ o% l+ b8 f3 S' o
        unsigned int packet_cout;+ X" ~. o* [: n/ l# Y( C2 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* Y9 r( n, F1 B. @$ b
6 B7 |* s! O" ^4 k. x+ W5 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) v2 u7 V6 n+ Q8 k
unsigned int count_copy = 0;& d" g! `' V) H  W0 W( D+ ^; J, B

' G( z% I" u% j" i, X3 P( q7 r7 n
int main()
2 e3 b7 ?! ~* u1 ]: z{" R$ q, [" [- C2 S" i. A
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 w; \/ w7 w$ q; f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ E$ q0 ^- }- I4 @* x" [5 v  I2 B, I' E" B# w) i
        while(1)5 ~( v+ b, R. v5 z- a4 |
        {6 H. t. ?1 }% A
                read_MSG_buffer(pshreRAM);3 X/ o3 ]3 p; F/ j2 |4 D3 y
        }               
0 @3 }9 B6 j% |' _2 @+ m% @# i}0 q; j2 C( D; |+ }
" @" P8 g( Z; Y2 l( I+ Q+ z3 o1 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% J/ \1 F4 q1 [
{" ]2 v: f4 Y1 Z- t( Z& r
        RX_MSG_PROTOCOL buf;
: ^2 I) {/ n# z* V  C* B6 [        
) f# b4 o' O6 i+ R        buf.a = pshreRAM->a;
0 Q) N& Y3 b: }$ i. M5 u        buf.b = pshreRAM->b;
" s  ^4 p) ^+ e! }) h% y( r        buf.packet_cout = pshreRAM->packet_cout;# ]* i9 m: i9 v! Q
        1 |1 L+ j9 j9 b) b3 j$ v0 c
        if(buf.packet_cout != count_copy)
+ s$ B' Y& h7 H* |/ R        {( _5 O, m! I2 t  F2 M0 z
                printf("a is %d\n", buf.a);. P" I) T1 ]6 z$ a# N) B8 C: a4 F
                printf("b is %d\n", buf.b);
9 t) U" Y7 N, `% B                printf("count is %d\n", buf.packet_cout);' N1 W# t+ y7 P' v8 d# R
                count_copy = buf.packet_cout;" y9 |# X; Y8 w" S6 M+ O( z
        }
/ m' @/ E1 {( H, [. U        else
. r8 Q* X' M  X" ]+ b; \6 [        {
. U, \. G' ^2 x1 F                printf("No effective message!");
' t% W" u8 O, z7 ], k- }9 B        }8 v$ s( {5 f+ \2 X
}$ x2 j; J3 |# W

% _! q  j% ^" v3 H& [- \4 y
7 u9 n0 B( j9 b* C( ?, f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 }7 |* @% i+ L  Y# ~7 I8 R8 j使用下面代码,对内存使用了mmap函数后:' p& h% i, H7 [4 x/ H) s4 D5 i/ E; Z
#include <stdio.h>
+ Y, V) o- ]; a#include <unistd.h>
, {+ O8 m5 c2 ], w#include <sys/mman.h>  F: Q1 H" q; f
#include <sys/types.h>
3 _& a0 f% e! Q! {- I( ?- b#include <fcntl.h>0 Q1 [$ M  B4 T1 `7 L) o( E
$ g7 ]/ T4 z- [+ t  L
#define SHAER_RAM_BASE_ADDR    (0x80000000)& `; \6 f# p# A( g4 i% [
#define SHAER_RAM_SIZE         (0x20000)   $ c8 S9 I" j# f2 A0 G( O7 n

. Q$ f& T/ \. b& rtypedef struct
- t' h  p- ~& f; q% j/ v{! w+ {; O8 I7 d$ m* u& ?
        unsigned int a;
. t( }* L. S* z3 O) [        unsigned int b;
+ J! A1 w7 k8 H6 m$ E8 o3 O# G3 w        unsigned int packet_cout;0 s2 a8 L0 y+ @# X" w  s' K% _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 P- n3 M: i+ J4 d; W+ J1 s: c0 M
6 v5 Q5 {+ }; k( e* t- \( w4 {void read_MSG_buffer(int *baseaddr);" h& C3 p$ j7 R
unsigned int count_copy = 0;) V# p1 f' h3 C
& Q8 s7 p1 O& ?* i
int main()% \! v7 Z+ x- A* E6 `# [* B5 H
{" S1 d7 [5 i, \, ^/ J# N5 M& P
        int fd;$ A. ~$ u, j5 u1 A- ?# c1 \( R
        int *mem = NULL;
5 `! V$ x& {; g3 ]& Z5 `( q4 ]7 W7 I( k+ n' q* Y8 h/ n1 S
        if((fd = open("/dev/mem", O_RDWR)) <0)$ N0 P  r3 M) L! R# v/ L7 y
        {' y2 K9 `( E: s- r( ~3 T* u
                perror("open error");
% P: j' g) m" H# s: K; T                return -1;
6 K% H; |) h' b$ ]" @        }* Y  }, t1 h* b
        0 ^: m0 h; ^; \+ Q- V6 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) F; n# r  d/ F, y& Q% r  P: V! X5 |# s& J  H& O$ P' a
        while(1)
: s5 G5 _2 N. G, t% M        {8 A, P% I, F+ O0 \/ v8 E4 }3 v( j
                read_MSG_buffer(mem);
3 A3 h' X9 @/ l4 D4 t' A: i2 S        }               
* a5 K9 u9 Y' e+ r}
( D3 j- o% k$ ^* c  w9 D( [9 {8 L& f1 Q) g
void read_MSG_buffer(int *baseaddr)1 w2 T. F$ ]! W4 D1 l# ~6 ^
{
' w( @, ~4 S2 L; K2 o8 W3 F, Y; G        pRX_MSG_PROTOCOL pshreRAM = NULL;
" x' w$ x& ?$ ~* @9 z
9 K- K* @8 p" @) h  j0 c) x        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 s+ X; {  S# H% U: k/ H

& S- ]& J  z( Z; Y1 E6 I7 g        if(pshreRAM->packet_cout != count_copy)) t" f' B, S4 J* r
        {
3 d4 Q+ p0 k  Q0 D: A                printf("a is %d\n", pshreRAM->a);
8 c8 n/ ^5 J8 {% h, c7 p5 m& N                printf("b is %d\n", pshreRAM->b);% A( _" o8 y- Q6 B( `
                printf("count is %d\n", pshreRAM->packet_cout);5 n7 @9 p+ n. I5 `: \3 c
                count_copy = pshreRAM->packet_cout;3 {3 [( ^* S4 y. w/ c
        }
5 E/ I; E( _. V+ j" _% B  [' B        else" y  D# j$ ~, n) b% a. ^% }% [
        {
' A( c1 p' V( J% T. \                printf("No effective message!\n");8 k3 S  f" q0 H( b- `& m
        }
. n. `' L1 L: O7 @}$ p* C- c* U+ [" Q6 J3 l$ i& `
% k, I8 s' D8 Z% `8 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ R6 S3 o2 L+ D" d9 d# z" B' r! Q; P
; q( h/ i' q4 y

2 X; Z" I6 p% x/ Y( o; Y. ~! ^0 D4 E0 P/ R; h6 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 01:03 , Processed in 0.040493 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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