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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 s, t7 f/ Z4 ^

. Q$ C5 F: F7 kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; A" m" y' X) F# D# t; j+ J
#include <unistd.h>
9 m# z: v, A6 O$ {#include <sys/mman.h>  u& f: F0 d/ h& y8 u3 T* Q( v
#include <sys/types.h>
* U5 d* W+ y! l1 Y) |2 Y' P( c#include <fcntl.h>
5 C) ?3 D0 A% S3 R, |# E; B
6 s9 e9 O6 R& D3 T; f  q#define SHAER_RAM_BASE_ADDR    (0x80000000)   + V+ I! h4 ?2 g" b* f/ k) w

6 E! g- M! [+ s* ^typedef struct
* z$ ?1 o. w1 ~0 M. W' r0 Q{
# u& x. p3 W+ z. f        unsigned int a;* d) g# n( x) g, S  m3 f
        unsigned int b;) \5 ^0 m4 {8 m" G; |2 C- ?
        unsigned int packet_cout;
  z- J0 h/ `1 Z  B' R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 X5 Y1 I- r0 Z! `8 l: }& F! M
, G* b: Z, M% xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 O# h' a1 C# t) l& M1 K
unsigned int count_copy = 0;
0 ^3 m3 n0 Q% R, S- `
& [" @! l* E+ H' z! e' V
+ i  m; N8 _2 q& W. @: u6 y; ~int main()
, t2 G- z& _0 `, J( {/ G0 M; G{
: x- a+ P* z, A$ |& J- Z4 @: y* a        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 o" a# M  ~2 E) E) H, u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; g5 R% `6 S. P& Y1 V
, O% Z3 M* `; h; B
        while(1)
  L7 L/ Y  s. ~3 b: L        {0 x9 q: c1 G" T7 E
                read_MSG_buffer(pshreRAM);
! E3 s+ _4 |; t- c; y        }               
, H2 N( c4 J7 l: Y, f/ v}3 ]1 ~& V& }2 n2 [" X, Y4 P
% F* h/ ?4 z. Z3 x; \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 M1 M0 p+ Y9 C. a  t{2 Y% R3 b, Y( _
        RX_MSG_PROTOCOL buf;+ e" ]7 R" q/ f7 N
        8 j2 t" G3 s  `  Q+ b
        buf.a = pshreRAM->a;" S' Z! B" |4 f/ g' n' @
        buf.b = pshreRAM->b;
# S* x5 E0 V$ X  L5 O2 @* E        buf.packet_cout = pshreRAM->packet_cout;
6 ~6 c  i7 N9 H! z( X" X+ n  `        * f% {! H" f4 w3 V. F- Z$ A+ Z
        if(buf.packet_cout != count_copy)! r' Q8 m' m! I
        {7 d, o. N3 A1 D. {* b8 ?. e
                printf("a is %d\n", buf.a);9 Z2 J% y9 d" ?- @, x. Q
                printf("b is %d\n", buf.b);; G& K- O" ?5 F: b1 I
                printf("count is %d\n", buf.packet_cout);( f% R3 C0 N. Q. Y) @
                count_copy = buf.packet_cout;
+ F/ `' u0 p2 w. X/ A        }
  _1 @' v' u3 L% ]        else
, e6 _2 z2 h& g3 q) `: q        {
' c" j( G2 x+ C                printf("No effective message!");8 V0 Z$ g# m$ _' r/ N: p1 V0 p4 X* C0 b
        }- E# |" N- g  y. C( `; _
}
- ~2 u9 r2 E2 j. d& i) X2 n' K( c& Z8 y% V
" v: b+ q4 p/ ^9 l/ v2 n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 I& [, h9 d+ ]  z( `使用下面代码,对内存使用了mmap函数后:
6 o9 b# @) n- C  o) J; ?3 b#include <stdio.h>
$ T$ L5 |4 U7 K% x& D7 ?#include <unistd.h>$ ~% ~  T/ ?0 {% \" }4 n% m
#include <sys/mman.h>
* S% F, B) G+ U/ t#include <sys/types.h>0 ?& T5 K% z% ]4 N* G/ R: x
#include <fcntl.h>
: ]) G1 W/ v/ j; e% E# h' k2 p/ F) e. b# L8 V% ^$ m: t
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 M( E3 y6 c8 I9 E2 n4 O
#define SHAER_RAM_SIZE         (0x20000)   & G- Q& M/ U; @; a, W7 q. V

& Z2 G; h8 [* r5 V9 g2 utypedef struct$ ?: I  D8 q9 \8 o% o; [
{$ u# c' k# Y, V: K
        unsigned int a;' f- \& h  V- h0 U3 G9 T; f9 R
        unsigned int b;
6 w2 L3 \4 v! U( A        unsigned int packet_cout;/ a0 C3 H7 p; k8 B- E; j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 g' m. ~7 `; ^3 V. g# s! W4 C% j$ [, D
void read_MSG_buffer(int *baseaddr);$ U& z- ?- Q; w% k% W
unsigned int count_copy = 0;, C# V4 c. N/ Y7 I! P5 F! c
1 j+ {. o" y& X; q( \4 }7 R
int main()0 \+ a8 J! K' a2 k; T
{5 [! [& I* J4 J1 o
        int fd;* R# R. O8 J! H$ p+ h; ?
        int *mem = NULL;
. E3 ^/ m6 W! ^
: t' t. R3 [3 T        if((fd = open("/dev/mem", O_RDWR)) <0)0 m  @8 E4 H* M- e
        {# K) W% g2 z6 y8 r! g0 h) A
                perror("open error");
7 [- d; u; n: D                return -1;
5 ~( G/ b% ?. {1 S1 W7 ]4 I- T0 x        }# g2 c/ G# ]4 y( r, R% ]8 x
        
: w. m% {; D9 K/ h: y/ w+ |( H3 i7 l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 D( D+ s6 G0 |+ m

0 t% G9 L+ ^0 m9 k1 W        while(1)5 h% V2 H$ Q' r2 |, p1 U- Q
        {9 b3 W3 w3 l1 u" b2 J! B* O
                read_MSG_buffer(mem);
) p3 r0 Q: M4 A' X0 z/ R        }               
: o/ i) n' ^0 `}
: ~- D8 h. ~: U: c6 k" @- R6 F# H: Z6 j+ m$ ~# U6 ^+ d
void read_MSG_buffer(int *baseaddr)
: {9 ~3 m6 H8 R{# E  r/ \( k4 e0 T; `/ o6 O4 }) i, ], Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 }4 S6 D3 Y/ s0 u* b" J& ~7 o2 |: P0 Y0 w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 R" d  c5 {- F" O  ]  U

! k, [+ O" ]* `/ b+ v        if(pshreRAM->packet_cout != count_copy)- h2 N2 g" \5 |3 n
        {4 X  v! u) d5 w6 Y) L
                printf("a is %d\n", pshreRAM->a);0 \1 n; o; R- {% p/ g/ @2 w+ n$ _- F+ _% p
                printf("b is %d\n", pshreRAM->b);  q5 N- i: `8 y7 y: r4 c
                printf("count is %d\n", pshreRAM->packet_cout);
. S1 R  v, |( y2 D1 _$ A  h                count_copy = pshreRAM->packet_cout;
! Y. a3 N7 b2 j" ?4 `( P        }
) Y* t3 b9 C1 R& |5 {* a9 t        else' {4 y/ h) i2 E; j' {" p) z3 P
        {
8 r' M1 s7 W" m8 v0 @# ?+ E                printf("No effective message!\n");
6 ~) ]( x4 |0 t& ]7 t$ V+ X- s6 S        }
: P* l1 c+ W  M, r: u0 P* A# c- m9 F9 S}) A5 X+ I9 `8 v0 ]5 q

: R8 I) I1 t: C1 P; Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ O. `6 q/ c; R0 l& ^9 u, s
& e1 y$ _8 [4 t( Z9 s
, S( ~" J' r( L. H, I- Z$ i3 p7 {) T3 k# ]" ~
* w; C/ Y2 Y0 F- ^  b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 19:16 , Processed in 0.041223 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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