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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( I. T4 k+ K. h8 B

, _/ f6 s/ V8 l  D' f+ ]8 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ V& b) }4 c6 P  q; C
#include <unistd.h>7 }6 J. v- J  v: A+ g. P3 s& Y- r, O
#include <sys/mman.h>
2 B% \! T, y" t3 Z#include <sys/types.h>
  \" u* P% V! s0 w#include <fcntl.h>, s% j: t- J* [
$ o: v9 C+ ], Q0 m
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * O6 `  {" ]( J2 p
' d! c- l/ I, P8 @5 s' F! c, f
typedef struct
! J/ \8 z: n# W8 B{
* {! ^- d8 `% m, _8 q: P9 n        unsigned int a;
# ~! @: F8 K$ Z        unsigned int b;
/ s* {  W  O  r$ K        unsigned int packet_cout;
$ @. m1 S! `* [; b6 M: p7 g/ W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( r/ X! V; |6 o( O! ]

: k: f1 O# z' ^8 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- b2 F+ ?9 v( C* ]4 runsigned int count_copy = 0;
  z' @6 M! ~9 A- Z. i
3 _7 P4 j2 D  w! S0 i& I  A; t4 }+ f0 f. B  E7 S7 a7 d& @
int main()4 `$ E4 u: ^, T6 Z  Q: ^! j
{
" O& c5 f  c$ j        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ D1 v! [4 z/ p! n# m& X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ I( k( P! u- T9 h' L& d+ p: @, d& U& e* b1 }
        while(1)
  K4 i& Z2 t  q) o        {
8 j" T  G+ ^8 u. R- N% m3 S$ p* y                read_MSG_buffer(pshreRAM);
/ X: I7 o( t. k; C1 D        }               
) D- }; q# f0 U2 J, g& M8 F}4 t2 s6 U- a# {; f- _
4 }6 h( t0 |* d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ?, m  G+ O- }2 t% v
{- D; {9 T( L1 ^% j* b
        RX_MSG_PROTOCOL buf;8 B5 r7 C# O8 Q$ a
        
) F7 B" t' k, K& w' ]# i5 {        buf.a = pshreRAM->a;
1 D  e' S7 Q3 B, E0 |# }3 o: j        buf.b = pshreRAM->b;" v: a& Y5 {  O
        buf.packet_cout = pshreRAM->packet_cout;
- ^# q6 t) `" ^0 y        
/ D7 Y! e3 [! ~6 c5 C9 p2 g        if(buf.packet_cout != count_copy)7 [# `  [. d% N. E( G8 f- j" D6 |$ Y
        {; [# R4 M, Y9 j! \7 Q6 S/ V' D; A
                printf("a is %d\n", buf.a);. K" }' R& K8 ~* k+ G( r% Y
                printf("b is %d\n", buf.b);
2 Y& s# x, U) D6 q                printf("count is %d\n", buf.packet_cout);
. x% u# m; p3 b" |" D  e4 A                count_copy = buf.packet_cout;
9 C( b" R, _) ?( A7 ~+ u8 M        }# U1 p8 J5 }6 r+ }
        else, h5 Q7 K5 h( g/ u8 f5 V8 M
        {
- u/ m2 |4 t% c7 T) c8 \                printf("No effective message!");
) o% j! y! g9 M, ~, o' m, {        }
, {3 [$ E1 [) ?6 B  N6 y% ?}- j0 M0 Q$ O0 A" W5 ~& \( t. p( O

3 _. U! U8 k% J2 v0 }
* k& Y. F4 g+ r9 J2 v! d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 @2 e' Y1 k7 ]- D
使用下面代码,对内存使用了mmap函数后:* o) d1 d+ t) [7 Y/ z( ^/ q+ M
#include <stdio.h>* E- \, v' t0 c
#include <unistd.h>
+ W" ]  {! X$ U  x5 R#include <sys/mman.h>% a% J- A0 h* l$ v
#include <sys/types.h>0 Q9 A$ z" @' k8 S! D
#include <fcntl.h>4 P* p, c0 M* X4 x: D
$ \/ Q4 x. k2 z4 Z2 O
#define SHAER_RAM_BASE_ADDR    (0x80000000)% _% j3 n! Z9 \  a9 I
#define SHAER_RAM_SIZE         (0x20000)   
" _& p! C8 y; g7 n- K7 Y& t" w, o! ~- J' z4 N+ U
typedef struct8 Y: A4 c$ K8 ]5 c" g! R
{  L) H$ B6 w) z* W  ^
        unsigned int a;
; }) f% t; T; @6 z* e/ x$ V4 s        unsigned int b;
. q; b! ^- Z% r        unsigned int packet_cout;
% s4 ^. p6 v5 U; c: L( {- v9 h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 I4 T7 z: u  N9 b6 M8 |* }8 \: t2 B' `6 G5 x; x6 M5 d
void read_MSG_buffer(int *baseaddr);
& _8 s; P- M* [& [unsigned int count_copy = 0;
, b3 y& a1 v/ O# h+ P1 j
& }1 c3 }9 a, `1 C9 z0 K( pint main()% Z$ a& |0 B' ?, m' N! n5 e2 I
{- l) E" }! u, P3 L
        int fd;- k* T3 L2 V1 n3 M5 G
        int *mem = NULL;
+ d1 z8 [( r! ~3 r$ }1 b) I5 G; N- `0 E3 ~, q& ?( n# y
        if((fd = open("/dev/mem", O_RDWR)) <0)
% L1 i$ k* q$ C0 S3 ~        {
2 V* Z4 \, S+ x2 S                perror("open error");
  y) i6 Z! M% G7 l9 p9 j* L                return -1;2 }/ n8 Z8 w" t
        }
! u( e3 o, S+ X2 G% R, U: r        ' q4 C$ o; i3 v+ }1 p
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ A" ~1 d  f' h# c4 l
% s9 z0 P0 W4 k" S0 `
        while(1)
' |7 l) F% v; ?8 J7 R5 L8 d        {
6 D. F0 h: b% H  z- r, |, ]+ j5 ~                read_MSG_buffer(mem);
6 W* I; [% P$ b+ h        }               
1 |4 D! a, k. q}
8 q# M3 [" i; b5 X# j& B! Q8 T# F% I
+ P/ q0 [4 t* ?- l5 }  \6 Mvoid read_MSG_buffer(int *baseaddr)
/ D$ F9 a" J: l) Y& y5 B3 U8 P% J' d{) {2 u1 f8 N7 Z; k% |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m7 d; F8 e2 z, d, t# K2 a0 j8 d" _2 `- t# K  _) F$ R1 z8 c
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' {) Z/ ~: r  }2 d

+ T. v) B" m7 M2 y0 `* L) t        if(pshreRAM->packet_cout != count_copy)
' g$ R2 t3 m* {. `        {
4 |6 @- [5 Z/ W# z# m$ S% F; Y                printf("a is %d\n", pshreRAM->a);5 F/ @# K; b  e
                printf("b is %d\n", pshreRAM->b);
+ S. ]" F. o: H                printf("count is %d\n", pshreRAM->packet_cout);7 X5 T0 V: j, T/ ]' s( S* j6 z
                count_copy = pshreRAM->packet_cout;: {8 X/ E5 f6 B
        }
( W* d% \0 P8 z, L; j3 [        else
0 }8 p0 P( |2 B9 H+ N$ O        {3 @1 f1 u/ Y. W
                printf("No effective message!\n");
9 S1 r& b. o" ]' P* ^9 P        }! ^4 E/ V# @) w4 o( ]$ X
}
3 p- I- S$ ~0 H! Q+ n& ]+ ~! _5 I4 ~. R$ p) m  B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- v  r# D  Z! v2 ?
! d/ M$ F# s5 s! G; K

  u: `; B# |1 h$ J9 V
1 Z2 b( E2 ?* f( H; C6 w4 @; b4 t! J) I# h3 W- e" N; V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 15:49 , Processed in 0.040552 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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