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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 o) J8 S0 E; x+ F6 j$ T1 P6 y9 \# g5 W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 i) |9 o# [) F3 g0 G#include <unistd.h>3 e6 E" J5 {6 o' G% O
#include <sys/mman.h>
. U8 A4 d4 E: O5 P  i- c% a#include <sys/types.h>! W- y8 y7 _6 C, c$ u3 }# P
#include <fcntl.h>& P2 T+ Z. O* ~/ I. o

) j( f, l" g! M5 k' ]#define SHAER_RAM_BASE_ADDR    (0x80000000)   , H/ Y/ H! |4 G& g' p
8 @. H. n8 V5 x- @5 ?7 v) K: [
typedef struct
* E- A6 A$ q6 b9 v+ C8 V5 i+ O{: Z. g9 B0 f3 ~
        unsigned int a;
  ^; \6 y* K8 \, h3 U* a        unsigned int b;) o8 @* y4 S1 ?: L/ ~1 o
        unsigned int packet_cout;; r" y, N6 |' T& l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! x/ c$ m8 s3 F7 y* N6 s& k
3 _# [2 V; C" P4 D9 L! U; ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 `! y+ n3 S! T; C! O( K- punsigned int count_copy = 0;
# D2 s/ ?4 |5 X* e* V# o1 ?2 ]& r. w" V

- t3 J) m# x. R2 ?0 H+ Mint main()/ r* E8 W9 W% v
{
5 z- D* ]- k9 w2 L& W        pRX_MSG_PROTOCOL pshreRAM = NULL;
  f% P) O& {" j2 s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% ^7 l2 f" Q. v, [- U, N

' J- |1 D; Q4 w4 Z. S        while(1)  ]' o/ S/ i6 q9 c  [* m0 S
        {6 c3 M  j; n- |5 _' y4 t4 M
                read_MSG_buffer(pshreRAM);- f. {1 v: K# q3 U: b7 W: K
        }               
% {# `& [% u5 U" p3 C( _}
' L1 I& [& }! J7 m1 Q* E. s5 g9 w, S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 @+ \/ ~8 o2 ~
{8 g+ u* N6 W$ X6 g1 L
        RX_MSG_PROTOCOL buf;
7 l+ ?6 W, ~  g. W7 l* P, a: R        
+ J- E1 a- d6 k$ q. f4 _- t1 {        buf.a = pshreRAM->a;/ N. F2 N+ T' k  l/ |
        buf.b = pshreRAM->b;
0 h. B) w; N. L' d2 t4 X        buf.packet_cout = pshreRAM->packet_cout;
8 j2 J% l7 r* F1 D) n: k        
: m4 k3 m$ ~( L2 S, E        if(buf.packet_cout != count_copy): x! N( K. \8 J( f, Q* e
        {  f0 z, |  `: r% |- X6 {
                printf("a is %d\n", buf.a);; _% G3 z  m# [' }6 B
                printf("b is %d\n", buf.b);$ a3 f0 M9 L/ c! E
                printf("count is %d\n", buf.packet_cout);; Y+ \" @. I% G; H1 `. }
                count_copy = buf.packet_cout;2 u+ a, m/ o) |: ^. J1 `
        }# @! R% C3 B) _0 f3 N- P
        else
! Q1 j; a- t" }; R& [0 e, C        {5 c; T" h. h' D4 f, o
                printf("No effective message!");9 C8 i4 I: x# v/ b+ @7 J
        }
" _* Z( [/ q  [% u( Q$ }( @}
5 y+ o. k) U2 t4 ]# e% U9 }8 Q% y$ S3 c: @* G
1 q6 l% F4 l9 y* h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* C% W0 v& v4 w  y& b& w使用下面代码,对内存使用了mmap函数后:
& x( c$ v2 G5 @/ Y! w, x#include <stdio.h>- c1 C1 B: a0 Y# u  |
#include <unistd.h>8 x: o7 P) ?4 r  R0 h9 L4 N! r
#include <sys/mman.h>8 E8 [* I4 d0 H8 v
#include <sys/types.h># L! [, A  @3 F4 }( [
#include <fcntl.h>
/ ^) ^' z) P9 j% @& ]' H, e4 d4 e, j& C: H
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) `! i8 O- L+ v5 c, x* v#define SHAER_RAM_SIZE         (0x20000)   * i" E4 @7 ^/ X" d/ z
, `1 Y1 }. A; j& N- e! W4 S
typedef struct
; h4 q7 W. S5 h( j) z" y, S7 t$ t( u{& K; P8 r. t  V, ]# N3 {
        unsigned int a;
$ w/ o* o9 G' K% @, [* C& i$ I. H        unsigned int b;# J, ?7 n: R( W' c2 M
        unsigned int packet_cout;
5 B* C) E8 I, _: C; o& _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% k8 X' ]% H; S6 [3 N! S
; b0 d3 Q( u: H7 |0 G2 }) h
void read_MSG_buffer(int *baseaddr);' G4 U0 _' k' f6 y
unsigned int count_copy = 0;* O0 o9 x$ P: `; V1 A( B1 \

3 h" y1 h# c/ x. P6 \; m7 k6 Wint main()
+ I2 a" ]3 [5 H) `% C$ G. M0 l{
7 w4 N  j, p; B' U        int fd;
+ O% o$ a/ T' O$ l        int *mem = NULL;
3 V7 L7 Y7 T" U) t: l+ R, r  G
/ F1 d$ }( y* G! f1 I        if((fd = open("/dev/mem", O_RDWR)) <0)
; P& \$ b8 \: y+ ?: U! j        {
! Y& c9 h$ _! z- \, j; G                perror("open error");
0 M2 g' G! X0 C9 _: @                return -1;
. }' b. r4 ?8 {' L4 `        }; X$ f  _' {; X' }' t, j/ c' `
        % e. z7 d" [& c8 E+ m
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 o5 N$ q* M# S( k" V( J% X
# a; D6 S5 y% y8 `
        while(1)
- b# J- e& Q& b) k; c1 f        {! U7 l/ ]* w) U. l5 H, {
                read_MSG_buffer(mem);
. R# V' \8 `: G: S        }               
& i8 D$ f7 q" ]}
( i- N' [  N3 E, p9 o2 {* i6 U9 }
void read_MSG_buffer(int *baseaddr)# c% L7 _$ C1 _! y7 c9 e
{! M8 e7 G" v1 O% K6 M4 C' h
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 J# a- S& `4 V4 L: q- b% U

* ~" B- H/ L2 K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" k0 h( x+ {% F1 D4 G1 D& Y& [' a% F) V& x0 B6 O1 Q7 w
        if(pshreRAM->packet_cout != count_copy)
8 c1 U; d/ z; a  i! I. Q        {
6 S0 _# I1 P9 p. O                printf("a is %d\n", pshreRAM->a);! W% \5 ?( |/ b5 h  G/ M
                printf("b is %d\n", pshreRAM->b);7 [/ v3 o+ c4 ?# [; v( i
                printf("count is %d\n", pshreRAM->packet_cout);7 r( C! V3 O- v
                count_copy = pshreRAM->packet_cout;  Q+ h, z0 ^8 O9 l; X6 E
        }
& X" T; ^8 N, a! Y9 }/ l        else1 {* u! ^% X7 a: T. l+ B- ^$ K( b
        {
2 W! y6 P7 r0 \6 y/ e                printf("No effective message!\n");
3 _" @  S- B* U/ m7 E( C        }: _) ~- g, w/ [2 n
}
: D4 N( g3 O/ M3 x! ^+ m0 b2 Q; f
/ l, a; M: b; ~* s* n8 l+ N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% a2 t0 t& \$ j) N2 j6 f
. o4 j. E5 b! m+ ]% n, Y+ x% Z( b. Y* n6 \
! G8 K; w5 M+ P7 A- `
% N: {. @8 l; t3 J, @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 10:02 , Processed in 0.039258 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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