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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 U" H2 H9 F: k. \# m) C
9 |% m; b( s" l. F' l7 wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 A1 {0 t* ^$ D- Z4 I  D, p
#include <unistd.h>+ _9 D' z7 W* d8 A! u2 y
#include <sys/mman.h>7 f* i# Y+ o: a
#include <sys/types.h>
' y/ ?& Y* q1 B% g3 |#include <fcntl.h>5 e* c6 Z/ J, l0 Y% a: Q+ W
" L! S7 |7 ^5 g5 j! G' }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 s! L. A0 C* b! f' X8 i) `
4 p+ d, p& X2 r2 |& Q$ x# L" S
typedef struct
/ x$ Z( V! I* J$ J; H. h{
% l# O- O7 D7 @, a        unsigned int a;
0 k$ r& E1 b& ?  p# W        unsigned int b;7 N+ y. z. a. q# D* @3 \
        unsigned int packet_cout;
2 ?! ?- C, S1 k5 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. I4 [5 d, U7 C

* c# n/ C, a  h, kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) \4 W; ?, p! W/ s4 tunsigned int count_copy = 0;( k0 ~6 L4 U9 c  l; M5 S+ D) T# w. S

; O: T6 l( h. E: u* k' u& k& D6 }, }5 {. }1 M0 U  M
int main()# X; ^3 b& H) h; h& u9 C7 a9 B3 N
{0 Y) ?* b+ p& v2 ?7 x. w1 l
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- [' v/ R, ^" A, d) k! T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) G' h9 G( ?. `+ \; [& R9 v& J' o2 Z2 x3 e# D0 [2 w
        while(1)
( K, f, e1 t) I        {% K: J! X' t. c. O, E$ r- Z
                read_MSG_buffer(pshreRAM);
8 l# j: m& N0 j' F9 U+ k$ J) Q        }               
0 R: ], ~7 ^  f7 R" d& h}8 G2 C+ D5 u" [; d

' N/ q( o; S4 J" i, d. {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), x1 D8 ]2 p( q) R( K8 S7 m
{$ M' V+ s  n& |7 p
        RX_MSG_PROTOCOL buf;
0 B2 M$ v: H7 `        
4 L9 S2 A3 M) E        buf.a = pshreRAM->a;5 [% V; c' B8 ~  V8 I- S
        buf.b = pshreRAM->b;
0 q3 `8 [5 L9 s        buf.packet_cout = pshreRAM->packet_cout;- m: m. j6 R- M# s$ u4 \
        " J; M' L, m: P/ C" M+ J- U( G
        if(buf.packet_cout != count_copy)
7 v& r& O6 `7 V! G" D8 [        {
$ C' V2 ?" D# R                printf("a is %d\n", buf.a);
* E1 _; ]( n9 H& A1 g# ]9 C: W                printf("b is %d\n", buf.b);3 j( t) [4 {' o
                printf("count is %d\n", buf.packet_cout);1 B/ Y/ X1 G, S1 z' L2 H, n
                count_copy = buf.packet_cout;
1 j. U2 f0 A" n- p0 _2 O, k  K        }
' C& ~/ n$ i1 t$ h/ P- N" ^# G% J        else
; m0 I) q& j7 o; \$ Y        {+ R  s7 H6 O* W0 Z: f2 b$ a7 `
                printf("No effective message!");! z. q2 ~6 ]: c1 _3 h7 ?2 v
        }4 ]- t4 G7 U4 U( z" k, j
}
* {* ^% K. I+ D- V& k. @, j. {, X
/ Y) E6 n2 b: P8 Y" L- ]. ^& K
9 f- S8 m- W# A' y; a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 U# ~( J( |& R( n; C  v0 l! @使用下面代码,对内存使用了mmap函数后:
+ Q7 s; Y9 ]' P) c#include <stdio.h>% G5 o6 G" _+ m# I, P9 \/ u: h
#include <unistd.h>4 }5 V2 b+ |8 B' z: t
#include <sys/mman.h>* o9 e( C# z" @1 I/ A6 i) i# Q1 H
#include <sys/types.h>5 C$ E' d9 o& t& U5 u' U4 b
#include <fcntl.h>
" _0 R9 V5 a1 x  M5 P7 n# D' i8 v* j! P  Q1 b+ L2 Z. P" D) i
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 A( ]. ~8 ?. ?
#define SHAER_RAM_SIZE         (0x20000)   6 r, @$ @0 e/ @( `
) _7 Y9 d  i* c0 ~1 O
typedef struct
, A; Q* |3 ^" O: p/ J# h4 {3 p0 j{
; M  a, E- B+ ^2 ^. S% {+ c  P+ W5 n' E        unsigned int a;
/ ?- G/ g% z  t: Q, s; {- V$ K" a        unsigned int b;
; B! y$ b! }( g$ O0 T! Q$ s        unsigned int packet_cout;" [. m4 P9 u. |0 s; `5 R5 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& j. H& L" s" T4 c8 P5 H3 ?! \* U, L# n  f9 @/ _
void read_MSG_buffer(int *baseaddr);
- W  g. E0 _2 V1 O5 i8 ]% uunsigned int count_copy = 0;
$ s2 A- W' u# V$ r
( T7 o2 x4 J9 r1 Y$ uint main()
( ]: b4 Q; A# Q: F3 F{
' L4 B" I; w" p: F6 y, B6 v        int fd;8 t/ s! ]7 B% `) J' e! c& L1 ?+ Z/ ?: \
        int *mem = NULL;: K$ Y0 ?( ~. z! Z
9 O. Z; g& t- h  U
        if((fd = open("/dev/mem", O_RDWR)) <0); f5 x" {% ^2 f' I" c
        {
1 k9 _) w' b5 j2 m" ~- M4 m                perror("open error");
& f9 }. k3 n! f5 a  \                return -1;
) q4 X$ n+ _: n& O# G" F        }5 ]  H  q/ f; R! b  g" o
        ) w( {# _9 u6 a6 ?# B
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- s* h0 w8 d: Y: F- M

* B- o* Y, }/ M4 a) p# Z        while(1)
8 G# g0 I% c, o. g- z+ X        {
" G/ k; m8 l; H2 F. C9 F                read_MSG_buffer(mem);
# o/ O& O- `( R% p( V# l- r/ [5 s        }                & j2 u4 V9 E+ m8 U8 D* }' N- R; B
}
$ O1 O% ]( C5 ^* ~! r, R3 g/ G; f' V$ j6 R: c$ Y
void read_MSG_buffer(int *baseaddr)
% U6 o* |, |! i" Z. m) w5 F2 P{3 L7 O2 D; e0 C8 V, G4 S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& f% S8 ^1 K; }3 Z3 W8 `/ T  Y% E! F2 _2 \! r0 {; [' v) r1 }' F1 `& T2 Y6 C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# z# l9 {) [2 r# X
* W: S& c+ C% k, {9 B8 \/ Z1 \
        if(pshreRAM->packet_cout != count_copy)8 b* k+ O; ]$ k  P" p2 n
        {
0 l. u: ~" G4 U! A9 `0 l                printf("a is %d\n", pshreRAM->a);' ]4 g2 A$ x6 t  z( t
                printf("b is %d\n", pshreRAM->b);
$ Z; I/ ]$ x1 K4 c" @) c1 v  R5 O- T                printf("count is %d\n", pshreRAM->packet_cout);
* Z1 P* ?6 C% v* C3 T& P                count_copy = pshreRAM->packet_cout;! Z) ?. x2 A$ E6 C- R& X
        }0 q3 C* P* _( g; I7 D- {6 _
        else3 I! L1 A2 {" A! l6 M) i- ?5 c' s
        {( {" H2 }: A, b- l( s2 u+ Z' ?
                printf("No effective message!\n");% B& ^7 M: _! D* _. C
        }) \/ T7 c1 ?& q% u9 ^  ]& l
}8 e9 d# |1 i4 C1 w
$ F! H" N: E: @  k" X9 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' S5 U% `/ J. \; B( v7 ~

& H% i% q; K$ M" G4 g
$ E- i% Q. Z! x2 @
3 S4 l, ]& d1 V
/ Q* |/ u+ j+ s/ z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 21:43 , Processed in 0.049164 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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