OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; X/ u7 ~' @5 Y; q: V$ m
+ Z- Q. t8 e/ I7 E0 d$ v" F$ lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( ~5 k" r/ U/ J" {8 B
#include <unistd.h>! c& T% y9 N* O/ ]6 L
#include <sys/mman.h>4 ~& H" ?0 O1 P1 s/ V
#include <sys/types.h>/ w. W/ m9 Q/ i! c
#include <fcntl.h>8 _4 D. m0 |1 C: f; V
$ t9 j& \; L- O2 h2 u5 ^* q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( }- v* p4 @& q* _; L/ V" V

" g1 y# E# I/ {8 ptypedef struct
! Z4 |! O4 l! Y1 i0 }{5 p: F) U+ a/ n! q8 |) R8 }: W& h
        unsigned int a;9 `- v! Q: Q$ K- E
        unsigned int b;
3 M0 i% }9 {7 d  \- u1 I$ v        unsigned int packet_cout;9 g- w$ J- V0 d* @4 P/ |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 o' O" Q5 C' h4 E% |+ m/ A" a1 J

& Z* _' A- D  k& l/ u; vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  C/ r" e4 d4 `  ]& {3 G; ^3 dunsigned int count_copy = 0;
0 M; `% w6 ]$ J& M* X
& K7 }: v: r) q, P
/ x. }7 Y8 r# J+ Z  Hint main()% \$ M7 }- w. j+ Y4 a6 |# ^+ a+ T# o
{4 S2 m5 L: D2 u# V  D5 z: P
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 E. y6 ]% J1 ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 q6 J& n4 b" b
& w& ~% h4 n( {        while(1)8 l0 \( L/ ~  q) ~
        {$ I) H" D: D1 {. V
                read_MSG_buffer(pshreRAM);
7 p  x+ d* t& x5 t8 R6 z$ d, p1 x        }                , O5 w' n$ q. O
}0 u1 H) F7 D0 g' x

) a0 l3 h* ]+ q3 h/ Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 C- a; u' E6 d$ m, L3 J# ?9 y
{
3 o. |1 X) L: R+ `9 y' H6 J        RX_MSG_PROTOCOL buf;$ |9 \8 I) O) E3 H7 C9 X
          F3 k1 |1 T5 Z. [/ p7 ]
        buf.a = pshreRAM->a;
1 V/ b& T# J$ ]% m        buf.b = pshreRAM->b;
$ W3 B- w& L$ O7 ^9 p4 C        buf.packet_cout = pshreRAM->packet_cout;; B8 s; a4 X; a9 O# Q4 g
        
2 c0 m! d1 S. U! l4 ?& O- P        if(buf.packet_cout != count_copy)
% f9 p" b9 V, y1 e8 t- T        {; ?% e- ?1 E* B% i5 x8 K; G
                printf("a is %d\n", buf.a);
: {2 S+ i$ s9 R7 f, D3 }2 p" k                printf("b is %d\n", buf.b);7 P* \2 t0 f& ]2 {# x& \0 c3 q
                printf("count is %d\n", buf.packet_cout);3 T: t( D' l" Z0 p; ^* s
                count_copy = buf.packet_cout;
1 o* c! S" R! r        }
1 i. P7 A3 K; G' Q% X        else4 o& h! S' D* ]8 I% R  ?# ^
        {& T4 P6 @: A# e7 P
                printf("No effective message!");5 j+ v2 ^+ n7 x/ ?" A
        }
! o3 ]$ @9 [( d$ k3 @6 n" k}0 D, v3 t, j1 c* K+ h# |0 `' S4 T
+ x+ G. r7 E6 i  p. |9 c
0 B" c* B5 i2 f9 V4 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ b1 }7 z4 j$ E" b1 Y' N$ s
使用下面代码,对内存使用了mmap函数后:
' _- N) p8 ^* W#include <stdio.h>5 j/ c7 W$ L7 W  X5 ]! P
#include <unistd.h>
8 G$ j) j; x9 M) x9 ~. k2 p#include <sys/mman.h>, F1 A+ Z' ~! E2 g2 r  W, |
#include <sys/types.h>
3 w/ S8 p8 c! K' ^' D( {8 ]#include <fcntl.h>
2 u/ A5 e1 }* C* A
% R+ t8 Y$ v* B) O#define SHAER_RAM_BASE_ADDR    (0x80000000), Q: e" h6 H2 S* h# p
#define SHAER_RAM_SIZE         (0x20000)   
2 T6 j, D- l/ r6 T! A& V6 f
+ p3 }8 d* o2 a5 w- l+ e6 Q* S: Ltypedef struct
+ m3 B8 j+ N9 O7 N$ e, r3 Q{
: S' @1 b& `  h- n. {: d        unsigned int a;  |# M$ X3 w2 ?: \" D* \
        unsigned int b;5 ?* a( P; T, Q0 _6 B7 Q
        unsigned int packet_cout;% g3 y4 g! G& }0 N( q7 u) h" ?/ ^; v3 f9 L& {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% Y5 r' A$ G0 X) t

( l* ^6 T; `+ Evoid read_MSG_buffer(int *baseaddr);' C7 V- Q9 q- D8 ~$ b3 k/ o
unsigned int count_copy = 0;' ?' A, t  \* w  u3 D5 v  d
9 T+ n( Y7 q, u" U1 z! w. l# ~1 y; G
int main()
( }3 K; R5 v% E2 a: K) a{- `  l# p' k0 G9 e/ r  k
        int fd;
0 p1 M5 G9 w1 D        int *mem = NULL;- T. t2 k0 }+ W4 F

3 W- v( U' l& w. I  I( u        if((fd = open("/dev/mem", O_RDWR)) <0)
! ~1 v$ G. X8 `. n9 U0 w        {
2 v; `. t& t* E4 @, q, v) w& G" v                perror("open error");
2 t: k1 [: K; e9 e  R5 m2 H1 l. {                return -1;% y* O& m' C. f& f6 Z0 g
        }) X2 b& z9 k2 v" y1 \9 [0 C/ t( e8 P
        
: s  x; D8 X) v- b2 P" \. V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 u3 N2 M0 @2 M3 R# k2 l  |
% Q0 ?$ Q( h9 o& ^        while(1)
' p4 M7 N; g3 [! U0 U        {2 N/ F0 |3 H2 }+ H* M( F
                read_MSG_buffer(mem);
. ?4 k& a* A& x5 J1 D        }               
! Z: c' a; j; T" A: }  S. P2 M}2 _; n: r9 H+ V( X
. J; b* G: h) U' U
void read_MSG_buffer(int *baseaddr)
7 r; s: Y. P+ l) T- W, T9 c: B3 Z{
2 a1 m8 Z# E* [+ S        pRX_MSG_PROTOCOL pshreRAM = NULL;2 r& ~/ N! ^4 V# A& f0 l

0 U( |; k$ H6 {        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 Z1 @( W. `+ a4 T

* Y  W) k0 `; k        if(pshreRAM->packet_cout != count_copy)
% r" {' B: N6 ]        {$ C! {$ J4 q$ u& H- g! o( m
                printf("a is %d\n", pshreRAM->a);
% V3 T2 o8 i2 {7 n" R                printf("b is %d\n", pshreRAM->b);
: b) S2 Y+ f8 a) }" B                printf("count is %d\n", pshreRAM->packet_cout);2 l/ p2 i- U0 O7 f! {# J
                count_copy = pshreRAM->packet_cout;  M. O. ]+ [* M. N  V& E
        }: Z3 {$ R/ ?) O/ A: {( S0 L
        else
( G" B# M3 B- C2 {        {
* n' u9 i! F5 w& W2 q4 i                printf("No effective message!\n");
3 P9 Y  U; G& K& E7 {9 U: E, e        }
3 j* m. P. e+ b9 X3 u1 o0 ]) g}
+ ?; R- J( j0 ?' _. x, P
( k4 M) y# D7 M3 r- {/ o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 X& W+ h, ?3 y7 f& U3 ^& {7 b' R  A7 o6 I) Q
/ u4 G) H- q0 }
% ~( m6 e- m1 g' C  H

% i; l( {; k/ u( }5 P0 E# c- ~4 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-20 11:27 , Processed in 0.041119 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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