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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ s1 Z9 D, {8 `+ E( m% \4 j1 k
% v. ?; M5 e% L8 }# ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ S+ C% f+ ?( P% \: @; c
#include <unistd.h>: N( M7 I7 A7 ^+ _1 n
#include <sys/mman.h>: w- D- q: J! L, D, q* J0 T; A5 g% T
#include <sys/types.h>& M! {+ k1 _$ _7 D
#include <fcntl.h>8 t* M' O2 W! r% t; m, G4 p8 c

4 Q: A! |& |; \% Q1 g* t/ |7 f#define SHAER_RAM_BASE_ADDR    (0x80000000)   - K2 t' O' K% y+ k. ?. k3 S
; B9 Y' c# R! q9 d( }7 G9 ~. v, z
typedef struct5 F$ `7 u# g, C8 R4 v
{
4 J, b" u: w* s2 R/ I: q- p8 M" W; k- i        unsigned int a;! H( W/ `- C. G0 O2 Q) D. N
        unsigned int b;
3 {6 F/ o" U7 Y% A. w: c        unsigned int packet_cout;
4 [& o- J# \+ _  o* i9 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* \2 t8 T7 |+ ~

/ C, U7 g9 J3 ]& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 L9 B% p7 Q" G. l( iunsigned int count_copy = 0;8 L! r- ?! G9 n8 z) t
( E2 o. t/ o7 E2 V( v9 l) ^
5 y/ ]) R9 G5 [( x6 A" c# c
int main()+ J4 Z" _0 `+ g. `: A( k1 g7 K2 T
{, l7 D/ [; V$ R! E7 V
        pRX_MSG_PROTOCOL pshreRAM = NULL;" S' \0 W5 o% `8 D" W4 e+ d1 E: C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ k* @! A8 x2 C/ e/ G0 ^

# U0 z& Z6 s. A* }: |; Q1 |        while(1)
6 ^+ ^. s, g- B, K# y        {5 A) M  j$ @6 v* A( \
                read_MSG_buffer(pshreRAM);  t2 J2 }2 B5 S) n" @
        }                0 y1 `; B3 b+ i4 C, a  _
}
/ \* X4 Q  _+ G! g1 u* b5 a* O. `  @- N3 [3 o( \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 e) |; V3 q) ]{7 o$ d; k7 k1 K, l, p  N
        RX_MSG_PROTOCOL buf;9 d2 X4 K6 W& P
        " D6 q3 S/ m5 ]1 q. c
        buf.a = pshreRAM->a;3 V" e' k. y3 H2 u* i8 w
        buf.b = pshreRAM->b;
1 d' c6 `( m# K4 h8 y        buf.packet_cout = pshreRAM->packet_cout;. |, V- i6 C, ?6 m
        $ L) o! E3 f  O( P& h
        if(buf.packet_cout != count_copy)% x. w$ v7 {; ]% W# I) {5 n+ C, C
        {5 r4 T. _! J, i$ n( J# ?% l
                printf("a is %d\n", buf.a);: b, x4 P- h' s* l9 \1 B+ S5 M
                printf("b is %d\n", buf.b);
) H- m4 {) m$ w8 o& N8 ]                printf("count is %d\n", buf.packet_cout);. J- ~9 x  \" D: ]( S1 ?: H
                count_copy = buf.packet_cout;2 `$ F. l: ~4 T
        }
3 W0 x( D' ~- z, P        else
; h! h& G+ H. k- E/ x        {
( E" o; a. g6 t4 H( U( m# U                printf("No effective message!");
( V2 k( E, N9 R( |4 E: P. U9 r        }& g/ F$ [2 }+ W* x
}2 _/ D) D: a: d7 b" c' _1 q+ h

5 P! J6 b/ V  R) q& l$ e+ X1 P4 O" h$ R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  ?- o) G& h0 i$ p" d
使用下面代码,对内存使用了mmap函数后:. Y/ v, a1 X2 _3 L( Z' i
#include <stdio.h>& u5 u  V4 d; H0 a, T/ K, C/ ]/ |
#include <unistd.h>
% o7 C$ h( t0 r# C, L) x6 }#include <sys/mman.h>9 Y+ m$ w8 z' e" C
#include <sys/types.h>
  ]1 Y) A" U8 x$ b" d0 e# Y#include <fcntl.h>
" C6 n& t* c6 w0 E6 l5 l& N5 V8 Z# A# }- q9 i) d+ z
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ M" }& [' K% L3 r  h9 F9 w9 b0 J
#define SHAER_RAM_SIZE         (0x20000)   / F* |5 V/ g3 s+ @* W& C9 y# ~

8 r9 P8 U7 x' U* r8 m/ ktypedef struct
+ C+ z5 F* M" g: Q. N& g) p8 [# l+ k6 ^{! B1 l  g/ o4 o6 I' L2 z& f
        unsigned int a;
6 H: K8 Y/ z) B5 T        unsigned int b;3 I2 o& Z6 h# Q, j
        unsigned int packet_cout;
* M) Q8 ]$ M7 ]5 s( W1 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, o0 T4 k+ g: C3 S& r4 Y1 D4 S
! O  t5 A9 f8 ?9 a) ~; z$ `void read_MSG_buffer(int *baseaddr);$ q1 e3 i. A: {! M* _( G% ]( J. T6 K
unsigned int count_copy = 0;7 E  t+ W, I, k) w8 G0 o

* y1 {8 ]" w5 e9 p. mint main()  O- M' o+ Z; Y8 y  I3 p
{
3 R/ \" z8 I& y8 A        int fd;0 X) I0 v1 x0 Z
        int *mem = NULL;
0 f# C% B( q5 G2 k! t4 }9 T' k; S; v0 i# g
        if((fd = open("/dev/mem", O_RDWR)) <0). ^4 L9 I2 @7 t
        {/ S' _1 H* x( o7 F6 V
                perror("open error");0 K  l! t- H) L
                return -1;
) w; v9 c( O5 n/ `- n  w        }
1 _8 V" q" t9 M& l  l2 ]0 r  ^6 o        
& O/ e$ P$ d4 ~1 r8 l: ~- W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 c5 k1 r7 F2 n8 o
1 z  j. f- P3 C# k9 y- [/ M        while(1)
& E& A! b  |/ t  c& _        {
, R# \  E& D5 b1 }: ^                read_MSG_buffer(mem);
+ [) k3 s# I; `% i0 c4 K6 p        }                1 e2 v+ `7 v; Q/ [8 B: B: v
}
& z! D8 ^  ]) w+ L' O9 C* n; m
3 o1 d  e7 v. @" z# b0 k. O) E, d! qvoid read_MSG_buffer(int *baseaddr)
( F4 U: m( {6 E" e' G4 e4 E/ v5 a: d0 t{
/ u' [5 x" u; x- N        pRX_MSG_PROTOCOL pshreRAM = NULL;( s- \( Y& ?1 z/ }" \2 U
) R4 b6 X+ b! ?, O  C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 W) t$ u) x# O, B
" ~4 g/ _+ w$ {5 Z6 S
        if(pshreRAM->packet_cout != count_copy)
$ I6 I' B6 m; E0 j9 ^( c2 |( c        {
6 C5 k& M7 J, z# [$ Y                printf("a is %d\n", pshreRAM->a);
1 B( M, U$ s+ P3 h; A7 i1 x                printf("b is %d\n", pshreRAM->b);" S' s$ q( M& Z
                printf("count is %d\n", pshreRAM->packet_cout);
# M% W! C: \' e; q; N. {9 {5 B                count_copy = pshreRAM->packet_cout;: E/ _5 [" B5 V  E. e
        }; b, T. @! ^+ A. a
        else5 ^5 Q" g% b9 P9 b* N
        {
7 U3 S; _( E7 w! {                printf("No effective message!\n");
- \2 p* [3 h# [        }: J! l8 u2 Y9 D
}
' ]! z8 ^# S2 p1 f7 e4 e1 `) W$ o4 c8 N; Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 p5 e4 {5 q; l1 r6 T' \
- n* |& b4 ^) s( M% b  ?
7 Y% K9 q+ j3 P( b' P/ E' o8 l7 _' L8 o4 D9 g( a3 h
& U4 j  [. \7 }1 h, {* k9 u' r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-19 07:57 , Processed in 0.040035 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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