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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 U9 I6 n5 s: U

3 N& K$ X: n! U/ d+ U8 zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& g6 u0 V2 e! t4 [#include <unistd.h>* C5 v0 u7 w; z7 C5 R
#include <sys/mman.h>
; N- s; b  }, Z! C) f#include <sys/types.h>" q0 U* |& E; R( g+ \4 t
#include <fcntl.h>
$ G9 \6 w% B9 T
6 `, p, ^. b6 F7 H1 k2 N. O1 z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 D5 G$ L! C* P! r6 l5 n) Z+ O1 y
& M) ^# x1 z2 U6 W" T5 {typedef struct
4 o/ D+ ?6 w6 q{
$ u3 i$ y" `: b2 M6 {        unsigned int a;: h0 l; A% p4 Y/ L5 z6 w
        unsigned int b;, d7 f9 R1 {+ H. s( k: ~% N9 a
        unsigned int packet_cout;
9 ^9 G8 F  o4 F0 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 B. J: U' A1 O4 x
( `6 s) `. C) l4 E: [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 A8 D, I  D2 w$ wunsigned int count_copy = 0;, }( ^/ u7 P  ?' e/ H

* E, m$ [5 D; Y
5 z! U) P: Y! |) ?$ O. |! N  mint main()7 ?1 q% Z6 d; j
{
# p; |7 A' H: y% w6 t& r  o        pRX_MSG_PROTOCOL pshreRAM = NULL;
# {& f6 [/ q% n/ j, ~( q- a* A' U) t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ p- G" ]' q" ?* Z) G% z
9 P- c$ L1 T( Y3 k
        while(1)
. l& M0 s8 C- \% ]: [& ~6 O- K0 A$ I        {
# J! t8 M7 P: _* T& J                read_MSG_buffer(pshreRAM);
$ h$ H, K; i8 ^. G        }                . E, u' i: V) Z9 b
}
3 C. T* U8 W5 K5 T9 a. R$ \7 l& Q, l
) J' S" v- t0 [7 evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 N" a1 i; M  q% O8 ~0 [
{" E  k, Q$ e! @) o. ]9 `& u
        RX_MSG_PROTOCOL buf;" @/ I" M1 |. v' _" {& e( z" |( q
        / ]. W3 Q  W; j* G5 C' f6 h: O
        buf.a = pshreRAM->a;
1 |; z6 W; t) M9 H2 u: N3 `        buf.b = pshreRAM->b;
# o- y( t3 u4 l" `        buf.packet_cout = pshreRAM->packet_cout;+ s% d; Z( @, O
        + j) R% Q4 |0 S
        if(buf.packet_cout != count_copy)' a+ R; X0 B- t' A6 Y( q9 g+ ~
        {6 \' q, p$ e: _0 o' q
                printf("a is %d\n", buf.a);
6 y9 w( k9 J2 ]( `% h                printf("b is %d\n", buf.b);
& i3 ?3 L. [- d& N; u9 @, }  g# ~                printf("count is %d\n", buf.packet_cout);
5 A+ V' u1 H/ J; T- @1 |% \; I                count_copy = buf.packet_cout;. ]) Z" O; d$ D) `7 H# I
        }
4 o) l, q- \4 B# g' t! y! c, ^        else
) A: c4 P* ^# m        {/ b9 I7 g( t- z$ Z6 t4 D
                printf("No effective message!");8 \# Y* `4 t8 `% p$ z  d8 F# x
        }
; d& i; |; W  X/ Z* R# R}
( M# ^) a8 y0 s, Z2 A
4 f. C" ~0 a7 K4 `' `' j8 @9 y: B7 S! O2 n5 L8 {5 o8 w; x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- }* Z" Q: W* R使用下面代码,对内存使用了mmap函数后:4 s' k" |- ]$ a( X
#include <stdio.h>4 q* y. @0 `  `6 J  k( `
#include <unistd.h>
4 N: h5 D# q, m$ [6 [5 \3 v#include <sys/mman.h>1 m1 M2 s: I! g" R- ?* q8 O
#include <sys/types.h>6 l! R2 X* E0 @! }& U
#include <fcntl.h>* g) c0 H/ M: P2 }. z2 p* h: V

$ F2 p# j+ h( i9 E% q#define SHAER_RAM_BASE_ADDR    (0x80000000): d+ o) F8 y* U+ {7 h
#define SHAER_RAM_SIZE         (0x20000)   
% D5 w( e" p+ I2 R
' F  p+ S: O9 Y/ Ltypedef struct/ G4 _. X  b- \9 A
{
6 e8 x7 O* {' f  d6 M        unsigned int a;8 a4 ?8 U0 Q( w" |+ i3 `: g0 x( X+ ^
        unsigned int b;
/ y" q8 V8 @: M6 S4 ^        unsigned int packet_cout;, w3 l' |3 n/ |: D+ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 b+ B# j# a; z$ r1 w  U5 z
/ L" X/ w- S6 H% ^: c" V- nvoid read_MSG_buffer(int *baseaddr);0 v4 E9 K) F" {( _* O) H8 i) V
unsigned int count_copy = 0;2 I  u& _! C3 ]9 w* {; Z
2 t' c  x: n7 v) T8 o0 [1 l
int main(); S, V0 \4 Y# F1 T0 w5 c, Q( G
{
! I9 w* B) ]: B        int fd;' D+ j: {* \6 Z" @) q. D/ {
        int *mem = NULL;
% d5 U! _5 A' ^2 j2 r
% f5 x: T7 G; }7 T; p) ]9 q        if((fd = open("/dev/mem", O_RDWR)) <0)
. y! Z+ `; n# d2 y        {( y* r, g3 M2 y
                perror("open error");1 [" s1 G& b. x! a% a5 R- c
                return -1;1 A6 b1 N+ R: N0 B. ~
        }
2 U1 ~; o4 L$ d2 O5 H7 u5 b) m1 i& @        
# s& C4 q! ^- |& E6 e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# S  o6 e  I) c% Y( B5 N7 o) K$ A

7 J+ y* q- p0 b$ D' h        while(1)8 W0 `) @3 I. \* f& F: j" z- [2 I
        {0 ^, g; g# I3 N& _2 G5 O" }6 w7 k
                read_MSG_buffer(mem);: z0 L7 F, v5 B) h! g4 Y+ E
        }                9 t* M* t, e' H- K4 j6 D
}
% L" Y9 z$ g" p1 q) j! V* T7 {; X" q" l8 a+ H4 `
void read_MSG_buffer(int *baseaddr)
, u" @3 w! X. Q) I  h{
! \8 H( {3 C. D" b        pRX_MSG_PROTOCOL pshreRAM = NULL;$ d$ x1 K) Y6 ^3 ?

' l' l( J: Q1 M) e3 G7 o" w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 y) F3 @- t! E, |2 `/ O; q
# G5 h& T- w' S( ~% K        if(pshreRAM->packet_cout != count_copy)
+ h. K& B; X4 j, R3 R+ b        {- g0 U9 u5 }: J( D
                printf("a is %d\n", pshreRAM->a);
" x6 ^8 }( w: \/ F: G                printf("b is %d\n", pshreRAM->b);
- b% c# u- Z6 l- a% Z( ~6 T% _. R                printf("count is %d\n", pshreRAM->packet_cout);
0 f( k' a# X9 J9 i- v" |                count_copy = pshreRAM->packet_cout;
. T7 Q' S- M9 |% ?+ @        }4 _: z; t( u% i, |
        else
, Q1 ^  Q+ K( @3 R# }        {# E  F4 p7 [0 {  P" E* |1 S
                printf("No effective message!\n");% K" p8 k3 R! `
        }
* t+ t: P9 ]1 r* @+ }$ ^' c& ~: j}
% x, T+ A1 f5 n' _/ X$ y3 j* R( i4 A( h+ {8 D! I$ W/ U( @% I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 _$ `0 D7 d9 C5 H6 H: l
. d* I! c# |# k  I) H
: r1 W$ k3 Y2 ]( e+ @/ E% D
' P; B; x$ N$ r/ x6 ]% L$ k; f
# P; P, r# @+ O' T) A8 n, t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-16 05:00 , Processed in 0.043187 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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