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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& Q* ?8 \# Y3 n% l) v
) u; J7 _' i* z8 @4 q1 Y; E. bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ a) ~+ |6 q5 {2 j  x#include <unistd.h>
+ m/ O7 _. g/ k0 C2 ]; `6 v0 G! g#include <sys/mman.h>
3 f7 k- V& s4 r6 @3 g( D* d) i  ?#include <sys/types.h>0 L; G6 b8 m' {, j" K& q4 u- z
#include <fcntl.h>% G( T4 e9 h# |: I0 p
, \5 _( g3 a% Y9 X! e+ w; a+ n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & [( \% m- D9 s1 V2 D2 }9 z
7 L2 Q6 K. l* R) E& Z. O8 k0 S/ X
typedef struct; e6 k% ~" M- h) @' P
{, [7 c8 O7 p% m( a- m6 x3 M9 H9 G3 ?
        unsigned int a;( ^# P% @6 @  M5 A
        unsigned int b;- [: T+ C2 N/ k) y
        unsigned int packet_cout;7 \' x" F* v+ W. N" d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 y! y4 [2 B: T6 B* g0 v; ]0 J5 l- |/ R4 X4 f  |7 d( i  s5 w+ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" N9 k! C7 ~! w8 o  H( m4 X
unsigned int count_copy = 0;7 M* D  _! M: z& X2 `. `* I
1 ?2 @2 k7 L  A# m! V
; c# M( W$ S: H4 E$ B( S
int main()
+ K: N) d& S+ y{! N/ U' N8 u5 _& X! F
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 c2 G% J$ q! H' f2 ?        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! b+ O6 x% r3 _
% D! W& n+ G/ ?
        while(1)* T! B) r" k* z9 [7 w* V
        {
+ k& `8 L# i/ k" i( z* L                read_MSG_buffer(pshreRAM);
+ q" G9 w) c0 Q0 b- [, u9 A) R0 b        }               
" K2 B% y$ t: n2 I}
/ }) b9 p: f$ N2 q% G6 s
( b* U! `  `# Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) f! d8 J8 v6 `6 l5 _{
+ }$ L+ n& L: s        RX_MSG_PROTOCOL buf;
# p+ w( N3 d4 t        ; l* o4 N9 }. T' z/ j# }4 s
        buf.a = pshreRAM->a;8 o$ Y* M' T3 W. g( I9 n, W
        buf.b = pshreRAM->b;
' |# @8 E  k$ ~/ j. U5 ~        buf.packet_cout = pshreRAM->packet_cout;
0 m. O9 Q4 X. K9 Z: c        7 \, c! a$ g" L
        if(buf.packet_cout != count_copy)' F* U  {9 g8 F# a: s
        {. }; I$ x- r& \4 C- U
                printf("a is %d\n", buf.a);! {' N. ]# ?2 @2 t& B* q" _& B
                printf("b is %d\n", buf.b);
9 g, a+ B  f/ o3 R/ @  l                printf("count is %d\n", buf.packet_cout);3 l" f0 I+ n: x2 X; B7 s
                count_copy = buf.packet_cout;' t6 f) E2 n5 r1 X& p/ c
        }
. f3 \& o/ r3 h3 Z$ d# d( c. A        else
4 d: {: \9 |% W$ b: ?1 F        {
8 [5 y% n1 f" U, h. B% t                printf("No effective message!");5 [( s' J' z9 r6 l! w9 e
        }- S, L* S. w- F; }
}/ a1 K& e7 W" }/ {' Q) ^

0 q: _( @* s% |% g4 [" @4 X: m. h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ x, U/ b# x) D
使用下面代码,对内存使用了mmap函数后:2 B* x& O; A; o: I  t) @0 d, O9 B- y
#include <stdio.h>, U+ G0 ~8 a* e4 k' C
#include <unistd.h>! @# |7 f* ]6 j, R4 y" r
#include <sys/mman.h>
5 Q0 A  d8 f( d2 Q- j, v#include <sys/types.h>
5 j8 |' p. }' ?- y: }, F" p#include <fcntl.h>, [( o  b2 j8 A' Q2 C/ g) X

7 s" c+ J* B$ y$ O. G#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 S6 _' ]  r$ Q& o#define SHAER_RAM_SIZE         (0x20000)   
; _0 X- d- i" Z" [0 ^- |: z- [4 F6 c: ~5 w5 Q  k) e' b) o
typedef struct7 c6 Y# I# p* z: j- I+ n* a3 P
{
$ X2 I; N2 r  P7 `        unsigned int a;
  N, r+ I5 s! W; P/ w        unsigned int b;
9 Z1 ~: k# M2 f3 C/ A3 i4 M        unsigned int packet_cout;& q4 d1 p4 I6 ?( W# e, ]1 G1 ?! D: P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 Y" y& B- I/ H% u' g1 t
7 J: l3 ^, P& b0 w: Nvoid read_MSG_buffer(int *baseaddr);
# {6 c; v7 t  O" ]5 T( _" eunsigned int count_copy = 0;
7 w& {7 Y. J" y, W# p3 A8 Z, |
! H- E, B" I0 W0 I: Nint main()
6 ~: K" _! k; S8 z* S' [. p{
2 o$ [9 Q/ W0 h5 \7 \* Y  `        int fd;8 f  ?0 o$ {  q2 y. G: p: `
        int *mem = NULL;
4 u% [4 P' s3 u  r) k; C4 f8 I) @9 m8 C5 A" u3 K1 N- b
        if((fd = open("/dev/mem", O_RDWR)) <0)
, b0 P, r- h$ {% V        {
7 I- V! D! D$ q+ Y                perror("open error");0 a* t3 ^0 B3 ~" C/ }0 k
                return -1;
( s/ H) w; H, z% t5 J        }, L& ]; M3 @/ k. B. T; T
        - h, _( F8 T0 @" ]1 m  A) J0 t5 L8 s
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 T( q1 j+ P. V# m

1 J6 Y) w* O. P' p- H( x1 i- K. I        while(1)
+ }& j6 \  K" g9 i        {5 J( g7 o" B( H* S" h
                read_MSG_buffer(mem);
, c* I! v7 H( d8 h6 o( k. i        }               
1 T) c7 r( x* C9 z# U/ Y}# D! k. z0 _4 f3 F9 k" E

. f/ \- A8 `5 b+ S: t$ q7 A+ ^0 q$ {# I9 ovoid read_MSG_buffer(int *baseaddr)8 I/ e5 o9 N; g5 D" N' {5 \
{
0 Z1 g4 r! ~# x$ O- X        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 Y1 |0 b9 j" {8 [
2 C3 w$ s, J* F' `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ j% I% U2 ?0 }  o" G
, ~% q$ i/ c5 [7 }7 X. z
        if(pshreRAM->packet_cout != count_copy)
# J; X+ h- t! s" R3 A        {
1 y+ @( X! x0 L; K) |( L/ Z' }                printf("a is %d\n", pshreRAM->a);4 q* D5 e" e0 P2 Y5 k" n
                printf("b is %d\n", pshreRAM->b);. P' Q7 @6 M/ F. G3 d) ^
                printf("count is %d\n", pshreRAM->packet_cout);
& j0 \- j: e5 c( A' G& z1 t                count_copy = pshreRAM->packet_cout;1 v+ a+ A7 ]  I" S9 I% F2 V
        }$ ?: Y) B6 k5 V6 f4 V) O4 ~
        else. t, N" c& O: @4 [) G
        {
, s$ ]; E0 d6 Y: S, \                printf("No effective message!\n");/ v" K, p# ^( }! u: Q, Y
        }
6 B( v5 p4 Q0 b6 u$ @0 `}
' Z: o  a% O" w, m0 Y4 ^& ]+ d! E& o$ D0 e  U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 f" b7 t8 u" q- n( ]* ?

( |7 k9 Z# Y  ?. _( ], L8 ]5 e: L  T) N2 ~5 l, z
$ O/ ?+ g4 a) Q2 S

) f6 c& g+ c. i; N! `) |4 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 22:38 , Processed in 0.039418 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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