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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 a* e/ r- R  M# n
1 e6 _  y: j8 v, O- U: F' B3 m, X  s9 rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( p5 K5 j' a4 p" F/ y
#include <unistd.h>& F) w  Y0 E: t9 N
#include <sys/mman.h>
% u! R( v, B9 i; V( y#include <sys/types.h>
( t3 `% x/ H, p6 e3 D6 ?#include <fcntl.h>' y, V& ^9 d  v, g: J, K  z

$ V& e& u& w& f9 e3 ^# N6 a  _#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; P! Y, m5 ?8 i4 E
% X. p1 w" A; ]' S& Z1 v/ A" P
typedef struct
6 |% d5 O9 t  [% S{
: n' M) y, k3 H7 q5 s5 V* _6 H6 e        unsigned int a;
2 g) f& C) |3 E* ?! c$ U, m        unsigned int b;2 c& O4 s3 `. X' J( l* r
        unsigned int packet_cout;
% O& j% f, F" p* I" c& @2 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) p% h( a8 Y$ ~" p5 ]" n' v
. @8 P8 s" r1 {# ~4 @4 p3 P& dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( v- H2 ?- u5 W! b0 N1 D. Q% q3 V1 k
unsigned int count_copy = 0;
/ e0 ^+ n: n6 A* p1 h
# Z5 x  [6 g, L! X5 m# c
. M) |9 j9 d$ mint main()
9 l% M" e2 |3 ~; @/ A( Q: P{9 B6 @* m1 Q3 @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) ?! l5 ^  K2 I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ K$ O# s% b: c# M1 x- k( i7 [+ g
- l# R6 f5 t+ e" p. E5 P        while(1)7 U1 }) {! U, `/ r
        {
! W6 D3 X5 b' V% j                read_MSG_buffer(pshreRAM);
. e2 r7 v" D% _        }               
  J& u8 p6 N& j2 _; i# P, |/ ]; j* F) d}4 u! v# _8 x' ?5 J5 {: m5 }

& ~2 f8 m' c3 c+ z7 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. B& [- o6 R' _- \# n7 M! L/ ~4 }6 U{1 x! t$ ?, I: |9 p9 P  g
        RX_MSG_PROTOCOL buf;
$ X3 |& ]$ F0 K0 m" ^        : L: Y) }, z- P6 s0 `
        buf.a = pshreRAM->a;& f0 n. b, I4 k4 `
        buf.b = pshreRAM->b;  P, U- X3 l7 ^1 {0 z& E
        buf.packet_cout = pshreRAM->packet_cout;4 ]/ f/ S4 ~% i) ~: W8 P
        0 m  X, b! \  ^# S: O
        if(buf.packet_cout != count_copy)
: b9 m$ Q& {+ b3 i        {7 }0 f5 T- O, ]5 S
                printf("a is %d\n", buf.a);
; x" k: f: A5 l3 g% c2 L, a9 ]( N                printf("b is %d\n", buf.b);; X7 i4 d) F3 J' W& j7 W7 r/ {
                printf("count is %d\n", buf.packet_cout);! g9 B1 @/ V! n5 r
                count_copy = buf.packet_cout;! w# _2 f: [# l7 s1 t+ O& `
        }
7 r( H- f' w" W; C        else
( l- @. z& l$ E/ P8 _        {
! T8 F! p1 @3 }" {                printf("No effective message!");3 f& a* g" q- N& R0 ?( ~8 e
        }
3 h$ G" I; _2 V}
5 k9 o( i" L; c( w3 \- N# m7 X  D( H" d' g# Q
+ |1 c( _( f8 g( b7 R) u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ `8 m: g& D  {  x7 X& o' W使用下面代码,对内存使用了mmap函数后:
- a0 M  W* K( }2 I% b#include <stdio.h>/ h* E; b2 N: \5 @- R  m
#include <unistd.h>/ p7 p9 o( u& N) h! b3 r; W
#include <sys/mman.h>
" @/ h" x* k9 m2 K' o" m' G9 q#include <sys/types.h>+ c( S7 {1 j/ g" Q' l8 M3 ^- K
#include <fcntl.h>
& m- x4 t" ]7 j  e0 k8 T: u; \' R: H) u) K
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 g; p# e: Y# e  m6 O, j! [#define SHAER_RAM_SIZE         (0x20000)   
( S1 t6 x/ o' R+ r
$ x2 k# k. b5 y" c3 k# ltypedef struct
6 r! m. z# O) W3 G/ H; d{
. n6 [9 I" @$ {# h4 j        unsigned int a;( k$ E+ u0 b' G8 J* L: A. T
        unsigned int b;
2 K* x% V* k8 o        unsigned int packet_cout;7 e5 B$ s9 W# U$ N/ M+ F5 Q% G9 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  l1 Z3 \! S- Q
  A& b6 O1 Z( g3 Kvoid read_MSG_buffer(int *baseaddr);
$ s, l+ e6 r+ K2 N) n0 nunsigned int count_copy = 0;
4 l& B9 C6 L0 l) Y1 {9 c
5 H* {0 P4 G+ m# K" _int main()
6 d$ W! Y2 x4 w: b{8 i1 ?" |4 W2 ]) @2 g( L' ]
        int fd;" x8 G/ `9 l3 @3 @4 d
        int *mem = NULL;
' m1 {, u2 j3 z" [3 _% c; D: h) z- H* F  r- ^! \. @
        if((fd = open("/dev/mem", O_RDWR)) <0): p0 Z2 d1 x, \- E" _& |
        {" B8 J: o4 N, o$ f
                perror("open error");
  ~$ o& y5 o2 Q                return -1;( T9 @; o( z6 _8 {, @: \
        }
2 ^& A5 [) o2 Q* L2 \' W# ~$ Y8 B! j        
; |/ f0 c$ i# L9 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, q) z7 j/ p. e5 Z. ]$ e; x, {+ W8 G" j; C4 M8 {( l
        while(1)  V0 o1 H7 }9 `4 ]+ Q# l) F
        {
4 ?3 N, P" N% V                read_MSG_buffer(mem);
! ?2 m$ \5 B4 Y0 h+ N7 s  w. U        }                ' Q' b* r) B4 K* w! l* I" j: r# H
}
/ x' A9 b5 [" H1 O0 ^2 l# r6 H- q0 V. K! C& {% l
void read_MSG_buffer(int *baseaddr)3 x: x9 t- N5 q3 B8 M. B2 q0 Y, _
{
' @8 X- [0 X. ?1 f        pRX_MSG_PROTOCOL pshreRAM = NULL;
% W5 P- _4 o* E( u4 T/ l$ @6 e/ S9 T: U5 \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! ^) r5 n- Z2 K. m! C1 x' F! l. _- M; W; ~
        if(pshreRAM->packet_cout != count_copy)5 I% l( z5 K0 M* l$ _9 `6 |
        {
1 e9 M6 y3 K  E/ Z7 V. Q                printf("a is %d\n", pshreRAM->a);
, J: ^  P- m8 k% k7 {, l0 q                printf("b is %d\n", pshreRAM->b);
. _3 Z7 }" x+ s, x                printf("count is %d\n", pshreRAM->packet_cout);
; j4 b' m0 j" ]3 ]& c% l( k                count_copy = pshreRAM->packet_cout;
0 d7 G( v  K7 ]# i1 V. U5 R        }
5 t5 ^$ V' ~% \  u1 H5 P        else
' V, c# `7 ^1 j, A& u$ D" T        {4 {" Q% d) w0 f, E0 Z7 g7 T
                printf("No effective message!\n");: J; M1 }, h% ^- n2 |/ a
        }
; e1 ]' A2 }! V}3 C4 F" a2 k3 }* ?4 H& k& K  D
( |) U" b" V8 q3 e) b* U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. A2 |+ w5 @/ h1 \
# h4 j/ i* |- N& l  w; z4 O3 B4 y% X9 V6 j# l, a) A8 i! M5 J5 A
% o( M; Q% }6 ?, f

) H: E# u. M7 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 09:13 , Processed in 0.040781 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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